登录/注册
梧桐雨
2256
占位
1
占位
0
浏览量
占位
粉丝
占位
关注
JUnit5的Tag、Filter、Order、Lifecycle
梧桐雨
2021-09-10 21:14:55 2021-09-10
139
0

Tag

JUnit5可以使用@Tag注解给测试类和测试方法打tag,这些tag能用来在执行时进行过滤,它跟group有点类似。

tag应该遵循以下规则:

  • 不能为null或者为空。
  • 不能包含空格。
  • 不能包含ISO控制字符。
  • 不能包含保留字符:, ( ) & | !

示例代码:

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@Tag("fast")
@Tag("model")
class TaggingDemo {
@Test
@Tag("taxes")
void testingTaxCalculation() {
}
}

@Tag还可以通过元注解和组合注解,实现自定义注解,参考: https://dongfanger.gitee.io/blog/JUnit/002-JUnit5注解学习指引.html#id2

Filter

打好了tag后,在执行时可以进行过滤,比如Maven配置:

<!-- ... -->
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<groups>acceptance | !feature-a</groups>
<excludedGroups>integration, regression</excludedGroups>
</configuration>
</plugin>
</plugins>
</build>
<!-- ... -->

groups用来指定包含哪些tag,excludedGroups用来指定排除哪些tag。

Order

JUnit5默认使用了某种算法来确定test方法的执行顺序。我们可以通过@TestMethodOrder进行自定义,既可以使用内置类,也可以使用实现了MethodOrderer接口的类。

内置类如下:

  • DisplayName 按DisplayName的字母数字顺序
  • OrderAnnotation 通过@Order注解指定顺序
  • Random 随机顺序
  • Alphanumeric 按test方法名和参数列表的字母数字顺序

示例:

import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(OrderAnnotation.class)
class OrderedTestsDemo {
@Test
@Order(1)
void nullValues() {
// perform assertions against null values
}
@Test
@Order(2)
void emptyValues() {
// perform assertions against empty values
}
@Test
@Order(3)
void validValues() {
// perform assertions against valid values
}
}

也可以配置全局的JUnit5的默认执行顺序,比如在src/test/resources/junit-platform.properties中:

junit.jupiter.testmethod.order.default = \
org.junit.jupiter.api.MethodOrderer$OrderAnnotation

Lifecycle

JUnit5默认会在执行测试方法前给每个测试类创建一个实例对象,让测试方法相互独立,这叫做per-method测试实例生命周期。

就算测试方法被disable了也会创建实例。

如果想让每个测试类只创建一个实例对象,测试方法共用这一个实例,那么可以使用注解@TestInstance(Lifecycle.PER_CLASS),这叫做pre-class测试实例生命周期。

pre-class有一些好处,比如:

  • 在实例中存储变量,然后通过@BeforeEach或@AfterEach修改。
  • @BeforeAll、@AfterAll可以作用于非静态方法和接口default方法。
  • @BeforeAll、@AfterAll可以作用于@Nested嵌套测试类。

有两种方式可以设置全局的生命周期模式,第一种是JVM启动参数:

-Djunit.jupiter.testinstance.lifecycle.default=per_class

第二种方式是配置文件,比如src/test/resources/junit-platform.properties:

junit.jupiter.testinstance.lifecycle.default = per_class

如果要进行全局配置,建议使用配置文件,这样在出现问题时方便进行追溯。

小结

本文首先介绍了给测试类和测试方法打tag进行分组,然后可以在运行时根据tag进行过滤,接着介绍了如何制定测试方法的执行顺序,最后介绍了两种生命周期:per-method和pre-class。

参考资料: https://junit.org/junit5/docs/current/user-guide/#writing-tests-tagging-and-filtering https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle

原文: https://www.cnblogs.com/df888/p/15000081.html

暂无评论