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. vi/vim输入中文乱码,无法输入中文解决方法

    vi/vim输入中文乱码,无法输入中文解决方法 编辑/etc/vimrc或者/etc/virc,加入以下内容即可 set encoding=UTF-8 set langmenu=zh_CN.UTF-8 ...

  2. centos7 安装Anaconda3及使用

    centos7 安装Anaconda3及使用原创wangshu_liang 最后发布于2019-01-31 14:08:23 阅读数 1046 收藏展开最近在服务器上安装了anaconda3,先简单说 ...

  3. 030. Python装饰器

    一  装饰器 1.1 装饰器介绍 扩展函数新功能的@定义:替换旧函数,返回新函数,在不改变原有代码的前提下,为该函数扩展新功能;语法:@ (语法糖) 1.2 装饰器的原型 def show(func) ...

  4. Docker-Compose入门-(转载)

    Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务 ...

  5. 8.2-3 partprobe、tune2fs

    8.2 partprobe:更新内核的硬盘分区表信息       partprobe命令用于在硬盘分区发生改变时,更新Linux内核中的硬盘分区表数据.有时在使用fdisk.part命令对硬盘进行分区 ...

  6. 安装beanstalkd队列问题——No package beanstalkd available

    CentOS7.4安装beanstalkd 时无可用源 No package beanstalkd availableError:Nothing to do 可从以下获取:wget /etc/yum. ...

  7. kylin的rowkey优化之按维度分片

    我们知道,系统会对cuboid的数据进行分片处理. 但是默认的分片策略是随机的,如果group by a,b 的查询命中了某个cuboid,但是a=1 and b=1 的两条数据在不同的机器上存储, ...

  8. GO学习-(37) 使用Air实现Go程序实时热重载

    使用Air实现Go程序实时热重载 今天我们要介绍一个神器--Air能够实时监听项目的代码文件,在代码发生变更之后自动重新编译并执行,大大提高gin框架项目的开发效率. 为什么需要实时加载? 之前使用P ...

  9. Asp.Net Core Api 使用Swagger管理文档教程的安装与使用

    这周因为公司的需求需要我做一个Api的程序,这周的三天时间我一直在Core Api和 framework Api之间做纠结.不知道要使用哪一个去做项目,想着想着就决定了.既然两个我都没用过那个何不来使 ...

  10. springboot 优雅的启动类

    优雅的sprongboot启动类 package fama.cost.server; import fama.cost.common.IStoppable; import fama.cost.comm ...