单元测试-参数化测试
# 600.单元测试-参数化测试
参数化测试是 JUnit5 很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。
官网文档:JUnit 5 User Guide #writing-tests-parameterized-tests (opens new window)
# 简介
例如利用@ValueSource 等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。常用注解:
- @ValueSource: 为参数化测试指定入参来源,支持八大基础类以及 String 类型,Class 类型
- @NullSource: 表示为参数化测试提供一个 null 的入参
- @EnumSource: 表示为参数化测试提供一个枚举入参
- @CsvFileSource:读取指定 CSV 文件内容作为参数化测试入参
- @MethodSource:读取指定方法的返回值,作为参数化测试入参(注意方法返回需要是一个流)
当然如果参数化测试仅仅只能做到指定普通的入参还达不到让我觉得惊艳的地步。让我真正感到他的强大之处的地方在于他可以支持外部的各类入参。如: CSV, YML, JSON 文件甚至方法的返回值也可以作为入参。只需要去实现 ArgumentsProvider 接口,任何外部文件都可以作为它的入参。
# @ValueSource
写个案例:
package com.peterjxl.learnspringbootwebadmin;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class Junit5Para {
@ParameterizedTest //表明这是一个参数化测试
@DisplayName("参数化测试")
@ValueSource(ints = {1, 2, 3, 4, 5}) //指定参数
void testParameterized(int i) {
System.out.println(i);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
运行情况:
# @MethodSource
static String[] stringProvider() {
return new String[] { "apple", "banana", "sh*t"};
}
@ParameterizedTest //表明这是一个参数化测试
@DisplayName("参数化测试2")
@MethodSource("stringProvider") //指定参数
void testParameterized2(String i) {
System.out.println(i);
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
运行结果:
# Junit4 迁移到 Junit5 指南
至此,Junit5 的教程就到这里了。如果要迁移,需要注意如下的变化(参考 官网文档 (opens new window)):
- 注解在 org.junit.jupiter.api 包中,断言在 org.junit.jupiter.api.Assertions 类中,前置条件在 org.junit.jupiter.api.Assumptions 类中。
- 把@Before 和@After 替换成@BeforeEach 和@AfterEach。
- 把@BeforeClass 和@AfterClass 替换成@BeforeAll 和@AfterAll。
- 把@Ignore 替换成@Disabled。
- 把@Category 替换成@Tag。
- 把@RunWith、@Rule 和@ClassRule 替换成@ExtendWith。
# 源码
已将本文源码上传到 Gitee (opens new window) 或 GitHub (opens new window) 的分支 demo21,读者可以通过切换分支来查看本文的示例代码
上次更新: 2024/10/3 10:01:52