单元测试整理
在国外软件开发中,单元测试必不可少,但是国内并不太重视这一块,一个好的单元测试可以提前发现很多问题,也减去和测试battle的时间
SpringBoot单元测试
SpringBoot自动生成的测试在test\java下,而且注意Test类所在包和Main类所在包名称是相同的,@SpringBootTest也确实是根据这个启动整个容器的(待研究源码)。如果不在同包名下,需要对@SpringBootTest加参指定Main所在的包
常用注解
@DisplayName——测试方法显示名称
@BeforeAll——所有测试方法运行之前先运行该方法(只运行一次)
@BeforeEach——每个测试方法运行之前都运行一次该方法(只要有测试方法运行,这个方法都会在他们之前运行,即使没有显式调用 )
JUnit5
SpringBoot 2.2.0版本开始使用Junit5作为单元测试默认库
JUnit5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit Platform
JUnit Platform是JVM上启动测试框架的基础,不仅支持JUnit自制的测试引擎,其他测试引擎也都可以接入
JUnit Jupiter
JUnit Jupiter提供了JUnit5新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用在Junit Platform上运行
JUnit Vintage
JUnit Vintage提供了兼容JUnit4.x、JUnit3.x的测试引擎,便于用户对JUnit进行升级
断言
Assertions
事先写好应该得到的结果,如果满足期望值返回true,否则返回false
// 简单断言
Assertions.assertEquals(expect, actual, msg)
Assertions.assertNotEquals(expect, actual, msg)
Assertions.assertSame(expect, actual, msg) —— 同一对象
Assertions.assertNotSame(expect, actual, msg)
Assertions.assertNull(actual, msg)
Assertions.assertNotNull(actual, msg)
// 组合断言
// 每一条断言都成功才成功
Assertions.assertAll(jobName, exec)
// 前置条件
Assertions.assertTrue(assumption, msg) —— 是否为true
Assertions.assertFalse(assumption, msg)
嵌套测试
@Nested
可以将各个单元测试整合起来,形成一个层次分明的完整测试
参数测试
@ParameterizedTest——每个参数测试都得先加这个注解
@ValueSource
@MethodSource
@NullSource
@EnumSource