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-methodpre-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

JUnit5的Tag、Filter、Order、Lifecycle的更多相关文章

  1. html tag filter in js

    html tag filter in js const html = `可当天预订,必须21时15分之前下单,要求必须<font color=green><b>60</b ...

  2. How to define Servlet filter order of execution using annotations

    If we define Servlet filters in web.xml, then the order of execution of the filters will be the same ...

  3. Filter execute order in asp.net web api

    https://stackoverflow.com/questions/21628467/order-of-execution-with-multiple-filters-in-web-api Som ...

  4. Sallen-Key Active Butterworth Low Pass Filter Calculator

    RC 2nd Order Passive Low Pass Filter The cut-off frequency of second order low pass filter is given ...

  5. Spring boot下添加filter

    https://www.cnblogs.com/OnlyCT/p/7133639.html ****************************************************** ...

  6. SpringBoot(四)-- 整合Servlet、Filter、Listener

    SpringBoot中有两种方式可以添加 Servlet.Filter.Listener. 1.代码注册 通过ServletRegistrationBean. FilterRegistrationBe ...

  7. 简说MVC Filter

    Filter与FilterProvider之间的关系 根据用途和执行时机的不同,MVC主要分为以下5种类型的过虑器:AuthenticationFilter.AuthorizationFilter.A ...

  8. Spring boot 学习八 Springboot的filter

    一:  传统的javaEE增加Filter是在web.xml中配置,如以下代码: <filter> <filter-name>TestFilter</filter-nam ...

  9. springboot 通过@WebFilter(urlPatterns )配置Filter过滤路径

    springboot 通过@WebFilter(urlPatterns )配置Filter过滤路径,没有配置/*,输入任何路径都能进过滤器 2019年04月25日 12:51:33 peigui.hu ...

随机推荐

  1. cut命令用于按“列”提取文本字符,格式为“cut [参数] 文本”

    8.cut命令 cut命令用于按"列"提取文本字符,格式为"cut [参数] 文本". 在Linux系统中,如何准确地提取出最想要的数据,这也是我们应该重点学习 ...

  2. centos下yum方法安装apache+php+mysql

    yum(全称为:Yellow dog Updater,Modified) 是一个在Fedora和RedHat以及SUSE中的Shell前端管理软件.基于RPM包管理,能够从远处镜像服务器下载RPM包并 ...

  3. xxl-job使用遇到的问题

    1.背景 最近公司在迁移定时任务,以前老的定时任务是基于quartz搭建的分布式集群服务,遇到如下几个瓶颈问题: 同一个任务只能有一个节点运行,其他节点不执行,导致性能低,资源也浪费 定时任务在抢占执 ...

  4. 痞子衡嵌入式:快速定位i.MXRT600板级设计ISP[2:0]启动模式引脚上电时序问题的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是一种快速定位i.MXRT600板级设计ISP[2-0]启动模式引脚上电时序问题的方法. 我们知道恩智浦i.MXRT600是主打音频市场的 ...

  5. [论文阅读笔记] Adversarial Learning on Heterogeneous Information Networks

    [论文阅读笔记] Adversarial Learning on Heterogeneous Information Networks 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问 ...

  6. javascript数组排序之冒泡排序

    冒泡排序 作为一名程序员数组的排序算法是必须要掌握的,今天来说最简单的一种数组排序----冒泡排序 冒泡排序原理 冒泡排序算法是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如 ...

  7. deeplearning量化

    deeplearning量化 量化配置 通过字典配置量化参数 TENSORRT_OP_TYPES = [ 'mul', 'conv2d', 'pool2d', 'depthwise_conv2d', ...

  8. arm,asic,dsp,fpga,mcu,soc各自的特点

    arm,asic,dsp,fpga,mcu,soc各自的特点 人工智能受到越来越多的关注,许多公司正在积极开发能实现移动端人工智能的硬件,尤其是能够结合未来的物联网应用,对于移动端人工智能硬件的实现方 ...

  9. Python-selenium,切换句柄及封装

    一.获取当前句柄及所有句柄 handle=driver.current_window_handle #获取当前窗口句柄print(handle)handles=driver.window_handle ...

  10. mybatis学习——使用注解开发

    前言: 一个语句既可以通过 XML 定义,也可以通过注解定义.不过,由于 Java 注解的一些限制以及某些 MyBatis 映射的复杂性,要使用大多数高级映射(比如:嵌套联合映射),仍然需要使用 XM ...