Notion Blog
技术分享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 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。