五、SpringBoot单元测试

Spring Boot提供了一些注解和工具去帮助开发者测试他们的应用

在项目中使用SpringBootTest支持只需要在pom.xml引入如下配置即可

1、Junit简介

JUnit 官网:https://junit.org/

JUnit 是一个用于编写可重复测试的简单框架

5.1.1、什么是单元测试

程序代码都是由基本单元不断组合成复杂的系统,底层基本单元都无法保证输入输出正确性,层级递增时,问题就会不断放大,直到整个系统崩溃无法使用。所以单元测试的意义就在于保证基本功能是正常可用且稳定的。

而对于接口、数据源等原因造成的不稳定因素,是外在原因,不在单元测试考虑范围之内。

测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等

  1. 单元测试

针对计算机程序模块进行输出正确性检验工作

单元测试是阶段性测试的首要环节,也是白盒测试的一种,该内容的编写与实践可以前置在研发完成,研发在编写业务代码的时候就需要生成对应代码的单元测试

单元测试其实是针对软件中最小的测试单元来进行验证的。这里的单元就是指相关的功能子集,比如一个方法、一个类等

  1. 集成测试

在单元测试基础上整合各个模块组成子系统进行集成测试

  1. 系统测试

将整个交付所涉及的协作内容都纳入其中考虑,包含计算机硬件、软件、接口、操作等等一系列作为一个整体,检验是否满足软件或需求说明

  1. 验收测试

在交付或者发布之前对所做的工作进行测试检验

5.1.2、Junit的特点

(1) 针对于 Java 语言特定设计的单元测试框架,使用非常广泛

(2) 特定领域的标准测试框架

(3) 能够在多种 IDE 开发平台使用,包含 Idea、Eclipse 中进行集成

(4) 能够方便由 Maven 引入使用

(5) 可以方便的编写单元测试代码,查看测试结果等

5.1.3、JUnit的重要概念

  • Test Class(测试类)

    一个测试类包含一个或多个测试用例

  • TestCase(测试用例)

    一个以@Test注解的方法称为一个测试用例

    测试用例必须存在于测试类中

  • Assert(断言)

    定义想测试的条件

    当条件成立时Assert保持沉默

    当条件不成立时抛出异常

  • TestResult

    收集测试结果

5.1.4、JUnit的规则

JUnit 的一些注意事项及规范

  1. 测试方法必须使用 @Test 修饰
  2. 测试方法必须使用 public void 进行修饰,不能带参数
  3. 测试代码的包应该和被测试代码包结构保持一致
  4. 测试单元中的每个方法必须可以独立测试,方法间不能有任何依赖
  5. 测试类一般使用 Test 作为类名的后缀
  6. 测试方法使一般用 test 作为方法名的前缀

5.1.5、JUnit 失败结果

  1. Failure

    测试结果和预期结果不一致导致表示测试不通过

  2. Error

    由异常代码引起,它可以产生于测试代码本身的错误,也可以是被测代码的 Bug

5.1.6、Junit常用注解

(1)、@RunWith

@RunWith用于指定测试类运行时要使用的测试运行器(test runner)

测试运行器负责管理测试的执行并提供各种扩展和定制选项

JUnit默认的测试运行器是BlockJUnit4ClassRunner,它用于运行JUnit 4风格的测试类

  • @RunWith 就是一个运行器

  • @RunWith(JUnit4.class) 就是指用JUnit4来运行

  • @RunWith(SpringJUnit4ClassRunner.class)让测试运行于Spring测试环境

  • @RunWith(Suite.class) 的话就是一套测试集合

  • @ContextConfiguration Spring整合JUnit4测试时使用注解引入多个配置文件

(2)、@BeforeClass

Junit5中改名为@BeforeAll

特点

  • 在所有的方法执行前被执行
  • 只被执行一次
  • 被@BeforeClass 注解的方法应该是静态的(即 static类型的)

这个方法用于在测试开始前做一些准备工作(如打开数据库连接)

(3)、@AfterClass

Junit5中改名为@AfterAll

特点

  • 只被执行一次
  • 在所有的方法执行之后进行执行
  • 被@AfterClass 注解的方法应该是静态的(即 static类型的)

这个方法用于在测试完毕后做一些工作(如关闭数据库连接)

(4)、@Before

Junit5中改名为@BeforeEach

junit测试类中的任意一个测试方法执行 前 都会执行此方法

该类型的方法可以被用来为测试方法初始化所需的资源

(5)、@After

Junit5中改名为@AfterEach

junit测试类中的任意一个测试方法执行后 都会执行此方法,(即使被@Test 或 @Before修饰的测试方法抛出异常)

该类型的方法被用来关闭由@Before注解修饰的测试方法打开的资源

(6)、@DisplayName

为测试方法或测试类设置用于显示的名称

(7)、@ParameterizedTest

为测试方法指定参数

(8)、@RepeatedTest

为测试方法设置重复执行次数

(9)、@Timeout

为测试方法设置超时时间

(10)、@Test

定义一个测试方法

@Test注解有两个可选的参数

  • expected 表示此测试方法执行后应该抛出的异常(值是异常名)

  • timeout 检测测试方法的执行时间

(11)、@Ignore

Junit5中改名为@Disabled

被修饰的方法不会被执行

5.1.7、断言

断言就是专门用来验证输出和期望是否一致的一个工具

换句话说断言就是判断一个方法所产生的结果是否符合你期望的那个结果

例如:如果你写个一个方法 sum( ) 用来计算两个数的和,那现在你想验证下你这个方法计算 1+1 是不是 2,你可以使用 assertEquals 断言方法,就像这样 assertEquals(2, sum(1,1)) ,如果 你 sum 方法计算 1+1 后返回的不是 2,那么测试方法断言就失败了这里就会报错提示你;如果返回的就是预期的2,那么就会继续执行 assertEquals 断言后的语句

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐