1.总览
这个文档的目的是为程序员提供综合参考文献,当他们写测试,扩展作者,引擎作者也包括创建工具和IDE公司.
1.1. 什么是 JUnit 5?
不像之前版本的JUnit, JUnit 5 是由几个不同的模块,他们来自三个不同的子项目.
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit Platform 充当位于JVM上的启动测试框架的基础. 它也定义了运行在平台上的测试引擎API-目的是开发测试框架. 此外,这个平台提供了控制台启动器,它从命令行启动了平台,和和为了在JUnit 4环境中运行任何测试引擎启动了基于JUnit 4 运行器. 第一类支持JUnit平台也存在与流行的IDEs和构建工具.
JUnit Jupiter 是新的编程设计模型和为了在JUnit 5写测试和扩展的扩展模型的组合. 这个Jupiter 子项目提供一个为了在平台上运行基于Jupiter测试的测试引擎.
JUnit Vintage 提供一个测试引擎,用于在平台上运行基于JUnit 3和JUnit 4的测试.
1.2. 支持的Java版本
Java 8或更高.
1.3. 略
1.4.开始
1.4.1. 下载JUnit Artifacts
略
1.4.2 JUnit 5 特点
要想找出什么特点在JUnit 5中可选和怎么使用他们,阅读User Guide相关章节.
- 在JUnit Jupiter中写测试
- 从JUnit 4移植到JUnit Jupiter
- 运行测试
- JUnit Jupiter扩展模型
- 高级课题
Junit 平台启动API
JUnit 平台测试配套设备
1.4.3 项目实例
要看完整的,可工作的项目实例, 而且能拷贝和试验, junit5-samples 库是一个开始的好地方.junit5-samples 库存储了一堆基于JUnit Jupiter, JUnit Vintage, 和其他测试框架项目示例. 你会在项目示例中发现合适的构建脚本
- Maven: junit5-jupiter-starter-maven
2.编写测试
下列例子提供了在JUnit Jupiter写测试的最小要求的一瞥. 这个章节随后的部分会提供更深的细节在所有可选的特点上.
import static org.junit.jupiter.api.Assertions.assertEquals;
import example.util.Calculator;//该段代码不能运行,因为该行报错,解决方法可能是写Calculater类
import org.junit.jupiter.api.Test;
class MyFirstJUnitJupiterTests {
private final Calculator calculator = new Calculator();
@Test
void addition() {
assertEquals(2, calculator.add(1, 1));
}
}
2.1.注解
JUnit Jupiter支持下列注解,功能是配置测试和扩展框架.
除非另有声明,所以核心注解都位于 org.junit.jupiter.api 包在junit-jupiter-api模块.
| 注解 | 解释 |
| @Test | 表示方法是测试方法. 不像JUnit 4的@Test声明, 这个声明不表明任何属性, 由于JUnit Jupiter中的测试扩展基于他们自己的专用注解上操作. 这样的方法是继承的除非他们被重写 |
| @ParameterizedTest | 表示方法是一个参数化测试.这样的方法是继承的除非他们被重写 |
| @RepeatedTest | 表示方法是一个重复测试的测试模板.这样的方法是继承的除非他们被重写 |
| @TestFactory | 表示方法是一个为了动态测试的测试工厂.这样的方法是继承的除非他们被重写 |
| @TestTemplate | 表示方法是一个测试模板,设计被多次调用,依据注册供应商返回的调用上下文的数目.这样的方法是继承的除非他们被重写 |
| @TestMethodOrder | 用来给注解过的测试类配置测试方法扩展命令.这样的方法是继承的; 与JUnit 4的@FixMethodOrder类似.这样的方法是继承的. |
| @TestInstance | 用来给注解过的测试类配置测试实例生命周期 |
| @DisplayName | 给测试类或方法表明一个惯用显示名.这样的方法是不能继承的 |
|
@DisplayNameGenera tion |
给测试类表明一个惯用显示名发生器.这样的方法是继承的 |
| @BeforeEach | 表示被注解的方法应该执行在当前类每个@Test, @RepeatedTest, @ParameterizedTest, or @TestFactory方法之前; 与JUnit 4的@Before相似.这样的方法是继承的除非他们被重写. |
| @AfterEach | 表示被注解的方法应该执行在当前类每个@Test, @RepeatedTest, @ParameterizedTest, or @TestFactory方法之后; 与JUnit 4的@After相似.这样的方法是继承的除非他们被重写. |
| @BeforeAll | 表示被注解的方法应该执行在当前类所有@Test, @RepeatedTest, @ParameterizedTest, or @TestFactory方法之前; 与JUnit 4的@BeforeClass相似.这样的方法是继承的(除非他们被重写),并且必须是静态的(除非"每一类"测试实例生命周期被使用) |
| @AfterAll | 表示被注解的方法应该执行在当前类所有@Test, @RepeatedTest, @ParameterizedTest, or @TestFactory方法之后; 与JUnit 4的@AfterClass相似.这样的方法是继承的(除非他们被重写),并且必须是静态的(除非"每一类"测试实例生命周期被使用) |
| @Nested | 表示被注解的方法是一个非静态嵌套测试类@BeforeAll和@AfterAll方法不能被直接用在@Nested测试类除非"每一类"测试实例生命周期被使用.这个注解不能继承. |
| @Tag | 用来表明筛选测试标签,在类或方法层面;与JUnit 4 TestNG或Categories的测试组相似.这个注解能在类中继承,不能在方法中继承 |
| @Disabled | 用来禁用测试类或测试方法;同JUnit 4的@Ignore. 这个注解不能继承. |
| @Timeout |
使测试,测试工厂,测试模板,或生命周期方法失败 当他们执行时间超出给定的范围.这样的方法是继承的 |
| @ExtendWith | 通过声明的方法来显示扩展.这样的方法是继承的 |
| @RegisterExtension | 通过编程方式显示扩展凭借场地.这样的方法是继承的除非他们被跟踪. |
| @TempDir | 凭借场地注入或范围注入支持临时目录在生命周期方法或测试方法;位于org.junit.jupiter.api.io包 |
2.1.1. 元注解和组合注解
JUnit Jupiter注解能被当作元注解使用. 这意味着你能定义会自动继承元注解的含义的自己的组合注解.
例如你能创造一个如下的叫@Fast惯用组合注解, 而不是复制粘贴@Tag("fast")在你全篇的代码上. 然后@Fast能被用作@Tag("fast")的随时调用的替代物.
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.jupiter.api.Tag;
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
public @interface Fast {
}
如下的@Test方法证实了@Fast注解的使用.
@Fast
@Test
void myFastTest() {
// ...
}
你能更进一步的介绍常用的@FastTest注解,他能被用作@Tag("fast")和@Test随时调用的替代物.
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
@Test
public @interface FastTest {
}
JUnit自动识别如下部分作为被标为"fast"@Test方法
@FastTest
void myFastTest() {
// ...
}