@BeforeAll 和 @BeforeEach

166 阅读3分钟

1. @BeforeEach 和 @BeforeAll

@BeforeEach

  • 作用

    • 在每个测试方法执行之前运行。
    • 用于初始化测试所需的环境或资源。
  • 生命周期

    • 每次测试方法运行前都会执行一次。
  • 适用场景

    • 用于设置每个测试方法所需的独立环境。
    • 例如,重置状态、初始化依赖、配置 Mock 数据等。

示例

@BeforeEach
public void setup() {
    System.out.println("Running @BeforeEach");
    // 初始化逻辑
}

输出

Running @BeforeEach
Running test1
Running @BeforeEach
Running test2

@BeforeAll

  • 作用

    • 在所有测试方法执行之前运行一次。
    • 用于初始化全局资源或配置。
  • 生命周期

    • 在测试类加载时执行一次,所有测试方法共享其结果。
  • 适用场景

    • 用于设置所有测试方法共享的全局环境。
    • 例如,启动数据库连接、启动 Mock 服务、加载配置文件等。

注意

  • @BeforeAll 方法必须是 static 的(除非测试类使用了 @TestInstance(TestInstance.Lifecycle.PER_CLASS))。

示例

@BeforeAll
public static void globalSetup() {
    System.out.println("Running @BeforeAll");
    // 全局初始化逻辑
}

输出

Running @BeforeAll
Running test1
Running test2

2. @AfterEach 和 @AfterAll

@AfterEach

  • 作用

    • 在每个测试方法执行之后运行。
    • 用于清理测试方法使用的资源或状态。
  • 生命周期

    • 每次测试方法运行后都会执行一次。
  • 适用场景

    • 用于清理每个测试方法的独立资源。
    • 例如,重置 Mock 服务、清理临时文件、关闭连接等。

示例

@AfterEach
public void tearDown() {
    System.out.println("Running @AfterEach");
    // 清理逻辑
}

输出

Running test1
Running @AfterEach
Running test2
Running @AfterEach

@AfterAll

  • 作用

    • 在所有测试方法执行之后运行一次。
    • 用于清理全局资源或状态。
  • 生命周期

    • 在测试类运行完成后执行一次。
  • 适用场景

    • 用于清理所有测试方法共享的全局资源。
    • 例如,关闭数据库连接、停止 Mock 服务、清理全局缓存等。

注意

  • @AfterAll 方法必须是 static 的(除非测试类使用了 @TestInstance(TestInstance.Lifecycle.PER_CLASS))。

示例

@AfterAll
public static void globalTearDown() {
    System.out.println("Running @AfterAll");
    // 全局清理逻辑
}

输出

Running test1
Running test2
Running @AfterAll

3. 对比总结

注解作用执行时机是否必须 static
@BeforeEach在每个测试方法之前运行,用于初始化每个测试方法的独立环境。每个测试方法运行前
@BeforeAll在所有测试方法之前运行一次,用于初始化全局资源或配置。测试类加载时是(除非使用 PER_CLASS
@AfterEach在每个测试方法之后运行,用于清理每个测试方法的独立资源。每个测试方法运行后
@AfterAll在所有测试方法之后运行一次,用于清理全局资源或状态。测试类运行完成后是(除非使用 PER_CLASS

4. @BeforeAll 和 @AfterAll 的非 static 用法

如果你不想让 @BeforeAll 和 @AfterAll 方法是 static 的,可以通过在测试类上添加 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 来实现。

示例

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class MyTest {

    @BeforeAll
    public void setup() {
        System.out.println("Running @BeforeAll (non-static)");
    }

    @AfterAll
    public void tearDown() {
        System.out.println("Running @AfterAll (non-static)");
    }

    @Test
    public void test1() {
        System.out.println("Running test1");
    }

    @Test
    public void test2() {
        System.out.println("Running test2");
    }
}

输出

Running @BeforeAll (non-static)
Running test1
Running test2
Running @AfterAll (non-static)

5. 使用场景总结

@BeforeEach 和 @AfterEach

  • 适合

    • 每个测试方法需要独立的初始化和清理。

    • 例如:

      • 初始化 Mock 数据。
      • 清理每个测试方法的临时文件。

@BeforeAll 和 @AfterAll

  • 适合

    • 所有测试方法共享的全局资源或配置。

    • 例如:

      • 启动和停止数据库或 Mock 服务。
      • 加载和清理全局配置文件。

6. 示例:完整的测试类

import org.junit.jupiter.api.*;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class MyTest {

    @BeforeAll
    public void globalSetup() {
        System.out.println("Running @BeforeAll");
    }

    @BeforeEach
    public void setup() {
        System.out.println("Running @BeforeEach");
    }

    @Test
    public void test1() {
        System.out.println("Running test1");
    }

    @Test
    public void test2() {
        System.out.println("Running test2");
    }

    @AfterEach
    public void tearDown() {
        System.out.println("Running @AfterEach");
    }

    @AfterAll
    public void globalTearDown() {
        System.out.println("Running @AfterAll");
    }
}

输出

Running @BeforeAll
Running @BeforeEach
Running test1
Running @AfterEach
Running @BeforeEach
Running test2
Running @AfterEach
Running @AfterAll

7. 总结

  • @BeforeEach 和 @AfterEach

    • 用于每个测试方法的独立初始化和清理。
    • 不需要是 static 方法。
  • @BeforeAll 和 @AfterAll

    • 用于所有测试方法共享的全局初始化和清理。
    • 默认需要是 static 方法,但可以通过 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 取消此限制。