你好啊,我是大阳。
本文我们讨论JUnit5测试生命周期,以及JUnit5与JUnit4的不同之处。
1. 测试阶段的生命周期
通常,一个测试类包含多个测试方法。JUnit 以生命周期的形式管理每个测试方法的执行。
在注解的帮助下,测试用例的完整生命周期可以分为三个阶段:
- 设置:此阶段将测试基础设施配置到位。JUnit 提供类级别设置和方法级别设置。通常,像数据库连接这样的重对象是在类级别设置中创建的,而像测试对象这样的轻量对象是在方法级别设置的。
- 测试执行:在这个阶段,主要是测试执行和断言。执行结果将使用成功或失败来表示。
- 清理:此阶段用于清理第一阶段的测试基础设施配置。就像配置一样,拆卸配置也分为类级别和方法级别。
在 JUnit 5 中,测试生命周期由四个主要注解驱动,即@BeforeAll、@BeforeEach、@AfterEach和@AfterAll。除此之外,每个测试方法都必须使用@Test注解进行标记。如图(使用drawIO绘制)
如上所示,在测试生命周期中,我们主要需要使用带注解的方法来装载和卸载测试运行的测试环境或测试数据。
JUnit 在默认情况下,为每个测试方法创建一个新的测试实例。
@BeforeAll 和 @AfterAll 注释,应该在整个测试执行周期中只调用一次。所以必须声明它们
static
。@BeforeEach并@AfterEach为每个测试实例调用,所以它们不应该是
static
.如果有多个方法使用相同的注解进行注释(例如两个方法使用@BeforeAll),则它们的执行顺序是不确定的。
-
要在 JUnit 5 中禁用测试,您需要使用@Disabled注释。它相当于 JUnit 4 的@Ignored注解。
@Disabled注释可以应用于测试类(禁用该类中的所有测试方法)或单个测试方法。
上代码:
package cn.dayangshuo.junit5.tests;
import cn.dayangshuo.junit5.Calculator;
import org.junit.jupiter.api.*;
/**
* @author DAYANG
*/
public class LifeCycleTests {
@BeforeAll
static void beforeAll() {
System.out.println("@BeforeAll 执行了");
}
@BeforeEach
void setupThis() {
System.out.println("@BeforeEach 执行了");
}
@Tag("DEV")
@DisplayName("生命周期测试")
@Test
void testCalcOne() {
System.out.println("======测试1执行了=======");
Assertions.assertEquals(4, Calculator.add(2, 2));
}
@Tag("PROD")
@Disabled
@Test
void testCalcTwo() {
System.out.println("======测试2执行了=======");
Assertions.assertEquals(6, Calculator.add(2, 4));
}
@AfterEach
void tearThis() {
System.out.println("@AfterEach 执行了");
}
@AfterAll
static void tear() {
System.out.println("@AfterAll 执行了");
}
}
执行结果:
2. JUnit5与JUnit4注解对比
两个版本中的大多数注释都是相同的,但也有一些不同。如下表:
特征 | JUnit 4 | 六月 5 |
---|---|---|
声明一个测试方法 | @Test |
@Test |
在当前类中的所有测试方法之前执行 | @BeforeClass |
@BeforeAll |
在当前类中的所有测试方法之后执行 | @AfterClass |
@AfterAll |
在每个测试方法之前执行 | @Before |
@BeforeEach |
在每个测试方法之后执行 | @After |
@AfterEach |
禁用测试方法/类 | @Ignore |
@Disabled |
测试工厂 | NAN | @TestFactory |
嵌套测试 | NAN | @Nested |
标记和过滤 | @Category |
@Tag |
注册自定义扩展 | NAN | @ExtendWith |
接下来我们将讨论JUnit5的断言、假设、测试套件和灵活的参数化测试功能。