文章目录
单元测试
主要介绍了Junit5,并且和 Junit4 做了相应的比较
1. Junit5 简介
从SpringBoot 2.2.0 版本开始 Junit5 就作为了单元测试的默认库
Junit Platform: 测试框架的基础,可以接入其他的测试引擎
Junit Jupiter: Junit5的核心,测试引擎
Junit Vintage: 兼容Junit4 和 Junit3 的老项目的测试引擎
SpringBoot2.4 移除了对Junit Vintage的依赖,所以如果想要兼容Junit4 需要自行引入依赖
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
2. Junit5基础使用
注意使用的Test注解是 jupiter 包下的
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}
对比 Junit 4
@SpringBootTest
// 不写runwith不会启动Spring容器,无法使用@Autowried等
@RunWith(SpringJUnit4ClassRunner.class)
3. Junit5 常用注解
@Test: 表明是测试方法
@RepeatedTest 重复执行
@ParameterizedTest:参数化测试
这个注解单独使用是没用用的,要和其他注解组合使用
例如 @ValueSource、@EnumSource、@CsvSource
@Test
@ParameterizedTest
// 注意这里strings跟方法参数的命名是没有关系的,是有规定的。根据数据类型决定,可以参照下图的源码
@ValueSource(strings = {"a", "b", "c"})
void contextLoads(String str) {
}
// 枚举
@Test
@ParameterizedTest
@EnumSource(value = TimeUnit.class, names = { "DAYS", "HOURS" })
void contextLoads(TimeUnit timeunit) {
}
// 如果方法有多个参数用@ValueSource就不行可以使用下面的方法。类似csv文件,不必考虑参数类型,参数只是单纯的被逗号分隔
@Test
@ParameterizedTest
@CsvSource({"s1, 1", "s2, 2"})
void contextLoads(String str, Integer num) {
}
@DisplayName 测试方法的名称
@BeforeEach 每个单元测试开始之前执行
等同于 Junit4 @Before
@AfterEach 每个单元测试之后执行
等同于 Junit4 @After
@BeforeAll 所有单元测试开始之前执行
等同于 Junit4 @BeforeClass
@AfterAll 所有单元测试结束之后执行
等同于 Junit4 @AfterClass
@Disable 测试不执行
等同于 Junit4 @Ignore