Junit 5官方文档中文版
  • Introduction
  • 用户指南
    • 概况
      • Junit5是什么?
      • 支持的Java版本
      • 获取帮助
    • 安装
      • 依赖元数据
      • 依赖关系图
      • JUnit Jupiter示例项目
    • 编写测试
      • 注解
      • 标准测试类
      • 显示名称
      • 断言
      • 假设
      • 禁用
      • 标签和过滤
      • 测试实例生命周期
      • 嵌套测试
      • 构造函数和方法的依赖注入
      • 测试接口和默认方法
      • 重复测试
      • 参数化测试
      • 测试模板
      • 动态测试
    • 运行测试
      • IDE支持
      • 构建支持
      • 控制台启动器
      • 使用Junit4运行JUnit Platfrom
      • 配置参数
    • 扩展模型
      • 概述
      • 注册扩展
      • 有条件的测试执行
      • 测试实例后处理
      • 测试生命周期回调
      • 异常处理
      • 为测试模板提供调用上下文
      • 在扩展中维持状态
      • 在扩展中支持的实用程序
      • 用户代码和扩展的相对执行顺序
    • 从Junit4迁移
      • 在Junit Platform上运行JUnit4测试
      • 迁移Tips
      • 受限的JUnit4规则支持
    • 高级主题
      • JUnit Platform Launcher API
    • API演进
      • API版本和状态
      • 实验性API
      • @API工具支持
Powered by GitBook
On this page
  1. 用户指南
  2. 编写测试

测试实例生命周期

Previous标签和过滤Next嵌套测试

Last updated 6 years ago

为了允许隔离执行单个的测试方法,并避免由于可变测试实例状态而产生的意外副作用,JUnit在执行每个测试方法之前创建每个测试类的新实例(请参阅下面的讲解,何为测试方法)。这个"per-method"测试实例生命周期是JUnit Jupiter中的默认行为,类似于JUnit以前的所有版本。

如果您希望JUnit Jupiter在同一个测试实例上执行所有测试方法,只需使用@TestInstance(Lifecycle.PER_CLASS)对您的测试类进行注解即可。当使用这种模式时,每个测试类将创建一个新的测试实例。因此,如果您的测试方法依赖于存储在实例变量中的状态,则可能需要在@BeforeEach或@AfterEach方法中重置该状态。

"per-class"模式比默认的"per-method"模式有一些额外的好处。具体来说,使用"per-class"模式,可以在非静态方法和接口默认方法上声明@BeforeAll和@AfterAll。因此,"per-class"模式也可以在@Nested测试类中使用@BeforeAll和@AfterAll方法。

如果使用Kotlin编程语言编写测试,则可能会发现,通过切换到"per-class"测试实例生命周期模式,可以更轻松地实现@BeforeAll和@AfterAll方法。

在测试实例生命周期的上下文中,测试方法是用@Test,@RepeatedTest,@ParameterizedTest,@TestFactory或@TestTemplate注解的任何方法。

修改默认测试实例生命周期

如果测试类或测试接口没有用@TestInstance注解,JUnit Jupiter将使用默认的生命周期模式。标准默认模式是PER_METHOD; 但是,可以更改整个测试计划执行的默认值。要更改默认测试实例生命周期模式,只需将junit.jupiter.testinstance.lifecycle.default配置参数设置为在TestInstance.Lifecycle中定义的枚举常量的名称,忽略大小写。这可以作为JVM系统属性提供,作为传递给Launcher的LauncherDiscoveryRequest中的配置参数,或通过JUnit Platform配置文件(请参阅了解详细信息)。

例如,要将默认测试实例生命周期模式设置为Lifecycle.PER_CLASS,可以使用以下系统属性启动JVM。

-Djunit.jupiter.testinstance.lifecycle.default=per_class

但是请注意,通过JUnit Platform配置文件设置默认测试实例生命周期模式是一个更健壮的解决方案,因为可以将配置文件与项目一起检入到版本控制系统中,因此可以在IDE和构建软件中使用。

要通过JUnit Platform配置文件将默认测试实例生命周期模式设置为Lifecycle.PER_CLASS,请在class path 的根目录(例如src/test/resources)中使用以下内容创建名为junit-platform.properties的文件。

junit.jupiter.testinstance.lifecycle.default = per_class

更改默认的测试实例生命周期模式可能会导致不可预测的结果和脆弱的构建,如果应用的不一致。例如,如果构建将"per-class"语义配置为默认值,但是IDE中的测试使用"per-method"的语义来执行,则可能使调试构建服务器上发生的错误变得困难。因此,建议更改JUnit Platform配置文件中的默认值,而不是通过JVM系统属性。

配置参数