
技术分享1 分钟阅读
JUnit 5 执行顺序和参数化运行
JUnit 5 的测试执行顺序
JUnit 是 Java 世界中最流行的测试框架,现在最新版本是 JUnit 5。在 JUnit 5 中,测试类和测试方法都可以使用注解来标注和配置。这些注解也定义了 JUnit 5 的测试执行顺序。 JUnit 5 的测试执行顺序为:
•
@BeforeAll - 表示在所有测试方法之前执行。这通常用于初始化较昂贵的资源,如数据库连接。
•
@BeforeEach - 表示在每个测试方法之前执行。这通常用于初始化比较便宜的资源,如测试用例级别的依赖项。
•
@Test - 表示一个测试方法。如果有多个 @Test 方法,则执行顺序按方法名称的字母序执行。
•
@AfterEach - 表示在每个测试方法之后执行。这通常用于释放 @BeforeEach 中初始化的资源。
•
@AfterAll - 表示在所有测试方法之后执行。这通常用于释放 @BeforeAll 中初始化的资源。

BeforeAll→BeforeEach→Order→name→name相同看参数数量→AfterEach→AfterAll
junit5 实现参数化运行
当我们测试某些方法时,这些方法具有多种条件或需要不同参数以实现不同的结果。按照传统的写法,为了测试这些条件和参数,我们可能需要编写多个test方法,从而导致大量冗余代码。这些测试方法的代码基本相同,只是需要更改测试参数。通过参数化,我们可以大大简化这种情况。通过使用参数化测试,我们可以轻松地使用不同的参数运行相同的测试方法,从而减少代码的冗余并提高代码的可读性和可维护性。
同事XX说为啥不用循环?用这些有什么用?
回答:如果用循环中间有一个断言失败或者报错就会停止执行。
需要导入 junit-jupiter-params jar包。
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.4.2</version>
<scope>test</scope>
</dependency>代码示例
比例需要测试toUpperCase 方法,把字符转换为大写的,按照常规的方法用不同的数据去测试,就是需要写多个test
但是用了参数化之后,就只需要写一个test的方法,就可以了
@ParameterizedTest
@CsvSource({"test,TEST", "tEst,TEST", "Java,JAVA"})
void toUpperCase_ShouldGenerateTheExpectedUppercaseValue(String input, String expected) {
String actualValue = input.toUpperCase();
assertEquals(expected, actualValue);
}输入数据:input
预期结果:expected
执行结果

以下是一些常见的数据来源注解:
•
@ValueSource: 提供单一参数值的注解。可以用于基本数据类型,字符串和枚举。
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void testWithValueSource(int argument) {
// test logic with argument
}•
@EnumSource: 用于测试枚举类型。可以提供一个枚举类,测试方法将使用该枚举中的所有值。
@ParameterizedTest
@EnumSource(TimeUnit.class)
void testWithEnumSource(TimeUnit timeUnit) {
// test logic with timeUnit
}•
@MethodSource: 允许你指定一个方法作为参数源。该方法应返回一个Stream、Iterable、Iterator或者数组。
@ParameterizedTest
@MethodSource("provideArguments")
void testWithMethodSource(String argument) {
// test logic with argument
}
static Stream<String> provideArguments() {
return Stream.of("foo", "bar");
}•
@CsvSource: 使用逗号分隔的值作为参数源。可以在一个注解中提供多个参数集。
@ParameterizedTest
@CsvSource({"apple, 1", "banana, 2", "orange, 3"})
void testWithCsvSource(String fruit, int count) {
// test logic with fruit and count
}•
@CsvFileSource: 从CSV文件读取参数。
@ParameterizedTest
@CsvFileSource(resources = "/data.csv")
void testWithCsvFileSource(String argument) {
// test logic with argument
}这些是JUnit Jupiter 中一些常用的参数化测试来源注解。你可以根据你的测试需求选择适当的来源注解。
读者评论
评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。
暂无评论,欢迎抢沙发。