Logo
Section 1 / 2

测试实例生命周期

让我们来了解如何在 JUnit 5 中使用测试实例生命周期。

导入

测试实例生命周期

让我们来了解如何在 JUnit 5 中使用测试实例生命周期。

每类测试实例生命周期

默认情况下,JUnit 在执行每个测试方法之前都会为每个测试类创建一个新的实例。这就是为什么 @BeforeAll 和 @AfterAll 注解默认只能用于静态方法的原因。这种按方法执行的测试实例生命周期适用于大多数情况,因为测试类中的各个测试方法应当相互独立,并验证同一目标对象的不同方面。

如果我们希望在同一个测试实例上运行所有测试方法,可以使用 `org.junit.jupiter.api.TestInstance` 注解,并将值设置为 `Lifecycle.PER_CLASS`。启用按类共享的测试实例生命周期后,我们就可以在非静态方法上使用 `@BeforeAll` 和 `@AfterAll`。此外,也可以在嵌套测试类中使用 `@BeforeAll` 和 `@AfterAll`。然而,如果测试方法具有状态,我们也需要格外注意。由于同一个测试类实例会被多个测试方法共享,因此可能需要在 `@BeforeEach` 或 `@AfterEach` 方法中重置内部状态。

Course Image

下面代码中的测试类在第 4 行使用了按类共享的测试实例生命周期。它包含一个名为 count 的内部字段作为共享状态。在 reset 方法中,我们在第 14 行将 count 的值设为 0。

1import org.junit.jupiter.api.TestInstance; 2import org.junit.jupiter.api.TestInstance.Lifecycle; 3 4@TestInstance(Lifecycle.PER_CLASS) 5public class LifecycleTest { 6 private int count = 0; 7 @BeforeAll 8 void setup() { 9 System.out.println("Start!"); 10 } 11 @BeforeEach 12 void reset() { 13 System.out.println("Setting count to 0!"); 14 this.count = 0; 15 } 16 @Test 17 @DisplayName("increase") 18 public void testIncrease() { 19 this.count++; 20 assertEquals(1, this.count); 21 } 22 @Test 23 @DisplayName("decrease") 24 public void testDecrease() { 25 this.count--; 26 assertEquals(-1, this.count); 27 } 28}

在上述代码中,@BeforeEach 注解被执行,此时 count 的值为 0。接着 testIncrease() 测试用例执行,count 变为 1,测试通过,因为条件为 true。随后 @BeforeEach 再次执行,count 重新被设为 0。然后 testDecrease() 执行,count 减少 1,此时测试再次通过,因为 count 等于 -1。

注意: 我们可以通过配置参数 junit.jupiter.testinstance.lifecycle.default 将默认的测试实例生命周期设置为 per_class。

参数化测试与动态测试

测试实例生命周期测验