Junit 入门
[TOC]
什么是 JUnit 5
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
-
JUnit Platform
它是在 JVM 上启动测试框架的基础。它还定义了
TestEngine
用于开发在平台上运行的测试框架的 API。此外,该平台还提供了一个 控制台启动器,用于从命令行启动平台,并提供JUnit 平台套件引擎,用于使用平台上的一个或多个测试引擎运行自定义测试套件。流行的 IDE(参见IntelliJ IDEA、 Eclipse、NetBeans和 Visual Studio Code)和构建工具(参见Gradle、 Maven和蚂蚁)。 -
JUnit Jupiter
是用于在 JUnit 5 中编写测试和扩展的新编程模型和 扩展模型的组合。Jupiter 子项目提供了一个
TestEngine
用于在平台上运行基于 Jupiter 的测试。 -
JUnit Vintage
JUnit Vintage 为在平台上运行基于 JUnit 3和 JUnit 4的测试提供了一个
TestEngine
。它要求 JUnit 4.12或更高版本出现在类路径或模块路径上
图(1)- junit 3大块之间的关系图个人总结:
JUnit Platform 它是 Junit 向测试平台演进,提供平台功能的模块,通过它,其他的自动化测试引擎或开发人员自己定制的引擎都可以接入 JUnit 实现对接和执行。
JUnit Jupite 是 Jnuit5 的核心,也是 JUnit Platform 的引擎实现。
JUnit Vintage 这个模块是对 JUnit3、JUnit4 版本兼容的测试引擎,让旧版本 JUnit 的自动化脚本也可以顺畅运行在 JUnit5 下。它也可以看做是基于 JUnit Platform 实现的引擎范例。
特性
- 嵌套单元测试
- Lambada 支持
- 参数化测试
- 重复测试
- 动态测试
环境依赖
java 版本
官方明确:
JUnit 5 requires Java 8 (or higher) at runtime. However, you can still test code that has been compiled with previous versions of the JDK.
推荐jdk
- JDK 8
- JDK 11
编辑器
- IDEA
- Eclipse
- VScode
编译依赖
- Maven
- Gradle
- Ant
Maven 项目配置
从 2.22.0 版本开始,Maven Surefire 和 Maven Failsafe 为在 JUnit 平台上执行测试提供了本地支持。Junit5-jupiter-starter-Maven 项目中的 pom.xml 文件演示了如何使用 Maven Surefire 插件,可以作为配置 Maven 构建的起点。
为了让 Maven Surefire 或 Maven Failsafe 运行任何测试,必须将至少一个 TestEngine 实现添加到测试类路径中。
为了配置对基于 JUnit Jupiter 的测试的支持,可以配置测试范围内对 JUnit Jupiter API 和 JUnit Jupiter TestEngine 实现的依赖,如下所示。
pom.xml 配置
<!-- ... -->
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!-- Maven 运行的依赖插件 -->
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>
</build>
maven库:https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
注释
JUnit Jupiter 支持以下配置测试和扩展框架的注释。
除非另有说明,所有核心注释都位于 junit-jupiter-api 模块中的 org.junit. jupinter. api 包中。
注释 | 描述 |
---|---|
@ Test | 表示某个方法是一个测试方法。与 JUnit 4的@ Test 注释不同,这个注释没有声明任何属性,因为 JUnit Jupiter 的测试扩展基于它们自己的专用注释运行。这些方法是继承的,除非它们被重写。 |
@ ParameterizedTest | 表示方法是参数化测试。除非重写这些方法,否则将继承它们。 |
@ RepeatedTest | 表示一个方法是一个重复测试的测试模板。这样的方法是继承的,除非它们被重写。 |
@ TestFactory | 表示一个方法是动态测试的测试工厂。这样的方法是继承的,除非它们被重写。 |
@ TestTemplate | 表示方法是用于测试用例的模板,根据注册提供程序返回的调用上下文的数量设计为多次调用。这些方法是继承的,除非它们被重写。 |
@ TestClassOrder | 用于在带注释的测试类中配置@ Nested 测试类的测试类执行顺序。这样的注释是继承的。 |
@ TestMethodOrder | 用于配置带注释的测试类的测试方法执行顺序; 类似于 JUnit 4的@ FixMethodOrder。这样的注释是继承的。 |
@ TestInstance | 用于为带注释的测试类配置测试实例的生命周期。 |
@ DisplayName | 声明测试类或测试方法的自定义显示名称。这样的注释不会被继承。 |
@ DisplayNameGeneration | 声明测试类的自定义显示名生成器。这样的注释会被继承的。 |
@ BeforeEach | 表示应在当前类中的每个@ Test、@ repeatedtest、@ parameterizedtest 或@ TestFactory 方法之前执行带注释的方法; 类似于 JUnit 4的@ Before。这些方法是继承的,除非它们被重写。 |
@ AfterEach | 表示应在当前类中的每个@ Test、@ repeatedtest、@ parameterizedtest 或@ TestFactory 方法之后执行带注释的方法; 类似于 JUnit 4的@ After。这些方法是继承的,除非它们被重写。 |
@ BeforeAll | 表示应该在当前类中的所有@ Test、@ repeatedtest、@ parameterizedtest 和@ TestFactory 方法之前执行带注释的方法; 类似于 JUnit 4的@ BeforeClass。这些方法是继承的(除非它们被隐藏或重写) ,并且必须是静态的(除非使用了“每类”测试实例生命周期)。 |
@ AfterAll | 表示应该在当前类中的所有@ Test、@ repeatedtest、@ parameterizedtest 和@ TestFactory 方法之后执行带注释的方法; 类似于 JUnit 4的@ AfterClass。这些方法是继承的(除非它们被隐藏或重写) ,并且必须是静态的(除非使用了“每类”测试实例生命周期)。 |
@ Nested | 表示带注释的类是非静态嵌套测试类。@ beforeall 和@ AfterAll 方法不能直接在@ Nested 测试类中使用,除非使用了“每个类”测试实例的生命周期。这样的注释是不能继承的。 |
@ Tag | 用于在类或方法级别声明筛选测试的标记; 类似于 TestNG 中的测试组或 JUnit 4中的 Categories。这样的注释可以在类级别继承,但不能在方法级别继承。 |
@ Disabled | 用于禁用测试类或测试方法。 |
@ Timeout | 用于在测试、测试工厂、测试模板或生命周期方法的执行超过给定的持续时间时失败。这样的注释是继承的。 |
@ ExtendWith | 用于以声明方式注册扩展。这样的注释是继承的。 |
@ RegisterExtension | 用于通过字段以编程方式注册扩展。除非这些字段被隐藏,否则将继承它们。 |
@ TempDir | 用于在生命周期方法或测试方法中通过字段注入或参数注入提供临时目录; 位于 org.junit.jupiter.api.io /目录包中。 |
注:注释加粗部分为常用注释。
JUnit5 命名规则
Junit5 文件工程目录
- 单元测试代码文件
- 默认协助工程目录:src/test/java
- 不予许写在业务代码目录下
- 测试资源文件
- 默认写在资源目录:src/test/resources
Junit5 文件命名
-
默认命令规则
- 以 Test 开头
- 以 Test 结尾
如果命名没有遵循上面其中一种规范。结果如下:
在 IDEA 中可以右键执行
原因: IDEA 并没有针对文件名做限制
使用 maven构建时,则不会收集不满足规则要求的用例
-
自定义命名规则(拓展)
使用 surefire 插件
<build>
<plugins>
<!-- 某些版本需要添加groupId,否则报错 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<includes>
<!-- 只要java文件名中包含 Hogwarts 的,都是测试文件 -->
<include>**/*Hogwarts*.java</include>
<!-- 只要java文件名中以 TestCase 结尾的,都是测试文件 -->
<include>**/*TestCase.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
注:不建议使用
官方文档:JUnit 5 User Guide