[跟着官方文档学JUnit5][二][WritingTests][学习笔记]
以下示例提供了在JUnit Jupiter中编写测试的最少要求。
package com.example.util;
public class Calculator {
public int add(int number1, int number2) {
return number1 + number2;
}
}
package com.example;
import com.example.util.Calculator;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MyFirstJUnitJupiterTests {
private final Calculator calculator = new Calculator();
@Test
void addition() {
assertEquals(2, calculator.add(1, 1));
}
}
1.注解总览
JUnit Jupiter支持以下用于配置测试和拓展框架的注解。除非另外说明,所有核心注解都位于org.junit.jupiter.api
包中,这个包在junit-jupiter-api
模块中。
注解 | 描述 |
---|---|
@Test | 表示这个方法为测试方法。不同于JUnit4的注解,这个注解没有声明任何属性,因为JUnit Jupiter中的测试拓展基于其自己的专用注释运行。除非被覆盖,否则将继承此类方法。 |
@ParameterizedTest | 表明这个方法是一个参数化测试。除非被覆盖,否则将继承此类方法。 |
@RepeatedTest | 表示方法是重复测试的测试模板。除非被覆盖,否则将继承此类方法。 |
@TestFactory | 表示方法是动态测试的测试工厂。除非被覆盖,否则将继承此类方法。 |
@TestTemplate | 表示方法是测试用例的模板,这些测试用例设计为根据已注册的提供程序返回的调用上下文的数据进行多次调用。 |
@TestClassOrder | 用于为带注解的测试类中@Nested测试类配置测试类执行顺序。这个类注解将被继承 |
@TestMethodOrder | 用于配置带注解的测试类的测试方法执行顺序;类似于JUnit4的@FixMethodOrder。此类注解将被继承 |
@TestInstance | 用于带注解的测试类配置测试实例生命周期。这个类注解将被继承。 |
@DisplayName | 声明测试类或测试方法的自定义显示名称。此类注解不会继承。 |
@DisplayNameGeneration | 为测试类声明自定义显示名称生成器。此类注解将被继承。 |
@BeforeEach | 表示注解的方法应在当前类中的每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之前执行;类似JUnit4的@Before。除非被覆盖,否则将继承此类方法。 |
@AfterEach | 表示注解的方法应在当前类中的每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之后执行;类似JUnit4的@After。除非被覆盖,否则将继承此类方法。 |
@BeforeAll | 表示注解的方法应在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法之前执行;类似于JUnit4的@BeforeClass。此类方法是继承的(除非他们被隐藏或覆盖),并且必须是静态的(除非使用"每类per-class"测试实例生命周期) |
@AfterAll | 表示注解的方法应在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法之后执行;类似于JUnit4的@AfterClass。此类方法是继承的(除非他们被隐藏或覆盖),并且必须是静态的(除非使用"每类per-class"测试实例生命周期) |
@Nested | 表示带注解的类是非静态嵌套测试类。除非使用"每类per-class"测试实例生命周期,否则不能直接在@Nested测试类中使用@BeforehandAll和@AfterAll方法。此类注解不会继承。 |
@Tag | 用于在类或方法级别声明用于过滤测试的标记;类似于TestNG中的测试组或JUnit4中的Category。此类注解在类级别继承,但不在方法级别继承。 |
@Disabled | 用于禁用测试类或测试方法;类似于JUnit4的@Ignore。此类注解不会继承。 |
@Timeout | 用于在测试、测试工厂、测试模板或生命周期方法的执行超过给定持续时间时使其失败。此类注解将被继承。 |
@ExtendWith | 用于以声明方式注册拓展。此类注解将被继承。 |
@RegisterExtension | 用于通过字段以编程方式注册拓展。除非这些字段被隐藏,否则将继承这些字段。 |
@TempDir | 用于在生命周期方法或测试方法中通过字段注入或参数注入提供临时目录;位于org.junit.jupiter.api.io包中。 |
2.元注解和组合注解
JUnit Jupiter注解可以用作元注解。意味着可以定义自己的组合注解,该注解将自动继承其元注解的语义。
比如,你可以创建名的为@Tag(“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(){
//...
}
3.测试类和方法
测试类:任何包含至少一个测试方法的顶级类、静态成员类或@Nested类。测试类不能是抽象的,并且必须具有单个构造函数。
测试方法:使用@Test、@RepeatedTest、@ParameerizedTest、@TestFactory或@TestTemplate直接注解或元注解的任何实例方法。
生命周期方法:使用@BeforeAll、@AfterAll、@BeforeEach或@AfterEach直接注解或元注解的任何方法。
测试方法和生命周期方法可以在当前测试类中本地声明,从超类继承,也可以从接口继承(参考测试接口和默认方法)。此外,测试方法和生命周期方法不得抽象,并且不得返回值(返回值所需的@TestFactory方法除外)。
类和方法的可见性:测试类、测试方法和生命周期方法不要求public
,但不能为private
。通常建议省略测试类、测试方法和生命周期方法的public
修饰符,除非有技术原因这样做。例如,当一个测试类被另一个包中的测试类拓展时。类和方法加上public
的另一个技术原因是,在使用Java模块系统时,简化模块路径上的测试。
以下的测试类演示了使用@Test方法和所有受支持的生命周期方法。更多信息在测试执行顺序和回调包装行为。
例子:设定为测试不通过
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.*;
class StandardTests {
@BeforeAll
static void initAll() {
}
@BeforeEach
void init() {
}
@Test
void succeedingTest() {
}
@Test
void failingTest() {
fail("a failing test");
}
@Test
@Disabled("for demonstration purposes")
void skippedTest(){
//not executed
}
@Test
void abortedTest() {
assumeTrue("abc".contains("Z"));
fail("test should have been aborted");
}
@AfterEach
void tearDown() {
}
@AfterAll
static void tearDownAll() {
}
}
输出结果
例子:设定为测试通过
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.*;
class StandardTests {
@BeforeAll
static void initAll() {
}
@BeforeEach
void init() {
}
@Test
void succeedingTest() {
}
@Test
void failingTest() {
//fail("a failing test");
}
@Test
@Disabled("for demonstration purposes")
void skippedTest(){
//not executed
}
@Test
void abortedTest() {
assumeTrue("abc".contains("c"));
//fail("test should have been aborted");
}
@AfterEach
void tearDown() {
}
@AfterAll
static void tearDownAll() {
}
}
输出结果
- 点赞
- 收藏
- 关注作者
评论(0)