JUnit5的Tag、Filter、Order、Lifecycle
2021-07-11 23:12
761 查看
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还可以通过元注解和组合注解,实现自定义注解,参考:
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
相关文章推荐
- Django中利用filter与simple_tag为前端自定义函数的实现方法
- Django开发(六)---自定义filter和simple_tag
- Day21-自定义simple_tag/filter
- How to define Servlet filter order of execution using annotations
- spring filter的targetFilterLifecycle作用
- spring filter的targetFilterLifecycle作用
- Django里面的自定义tag和filter
- Django自定义filter和自定义simple_tag
- django - 自定义jinja2的tag与filter
- spring DelegatingFilterProxy,targetFilterLifecycle的作用
- Python3之Django Web框架模板篇(templates)与自定义filter与tag
- 使用Filter抓取页面Tag--HTMLParser
- spring filter的targetFilterLifecycle作用
- 实战django之simple_tag and filter
- Django里面的自定义tag和filter
- (转载)File System Minifilter Allocated Altitudes & Load Order Groups and Altitude Ranges
- Distributed Cache Coherence at Scalable Requestor Filter Pipes that Accumulate Invalidation Acknowledgements from other Requestor Filter Pipes Using Ordering Messages from Central Snoop Tag
- 18)django-模板的过滤器和tag,自定义simple_tag和filter
- ffmpeg中aneuqalizer的FILTER_ORDER解释
- @register.filter与@register.simple)_tag区别