@BeforeAll 和 @AfterAll 用于在整个测试类生命周期中各执行一次初始化和清理,必须为 static 方法,适用于高开销、共享型资源(如 WebDriver、H2 数据库),不可用于需测试隔离的场景。

@BeforeAll 和 @AfterAll 是 JUnit 5 中用于管理全局资源的核心注解,适用于整个测试类生命周期内只需初始化和清理一次的场景,比如启动 WebDriver、连接数据库、加载配置文件、初始化共享缓存等。
什么时候该用 @BeforeAll 和 @AfterAll
当资源开销大、创建成本高,且多个测试方法共用同一份实例时,适合用这两个注解。它们必须是 static 方法,保证在所有测试开始前执行一次、所有测试结束后执行一次。
- 典型适用:浏览器驱动(WebDriver)、嵌入式数据库(H2)、Spring 上下文(非每个测试重载)、远程服务桩(stub server)
- 不适用:普通对象、局部变量、需要按测试隔离的资源(这类该用 @BeforeEach/@AfterEach)
- 注意:如果测试类被并发执行(如启用并行测试),@BeforeAll/@AfterAll 仍只运行一次,但需确保线程安全
@BeforeAll 做什么:一次性初始化
在这个方法里完成资源创建、状态预设、环境准备。例如:
- 启动 ChromeDriver 并设置全局隐式等待
- 打开一个共享的 H2 数据库连接,并执行建表 SQL
- 读取 application-test.yml 并注入到静态 ConfigHolder 类中
- 启动 WireMock 服务监听 8089 端口
示例代码片段:
立即学习“Java免费学习笔记(深入)”;
@BeforeAllstatic void initSharedDriver() {
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
}
@AfterAll 做什么:统一释放与清理
这个方法负责回收资源、关闭连接、清除临时数据、停止服务,防止内存泄漏或端口占用。必须包含显式 cleanup 逻辑,不能依赖 GC。
- 调用 driver.quit() 而非 driver.close()
- 关闭 DataSource 或 Connection(尤其使用 try-with-resources 未覆盖 static 场景时)
- 停掉 WireMock、Shamrock、Testcontainer 等外部进程
- 删除临时目录(如 Files.createTempDirectory("test-") 创建的)
示例:
@AfterAllstatic void tearDownSharedDriver() {
if (driver != null) {
driver.quit();
}
}
常见陷阱与建议
这两个注解看似简单,但容易出错:
- 忘记加 static —— 编译通过但运行时报错“must be static”
- 在 @BeforeAll 中抛异常 —— 整个测试类直接跳过,不会执行任何 @Test
- 把可变状态(如 List、Map)声明为 static 并在多个测试中修改 —— 导致测试间污染
- 未处理 @AfterAll 的幂等性 —— 多次调用应无副作用(比如重复 quit 已关闭的 driver)
- 混合使用 @TestInstance(Lifecycle.PER_CLASS) 时要格外小心:虽然实例复用,但 @BeforeAll/@AfterAll 行为不变


















