2.10、测试实例得生命周期
为了允许独立测试方法能够独立得执行,并避免因为可变得测试实例状态而造成得副作用,JUnit
在执行每个测试方法之前都会创建一个新的测试类得实例。在JUnit Jupiter
跟之前所有得Junit
版本相似,其默认得生命周期是per-method
。
请注意,即使使用
per-method
这种测试生命周期,通过条件测试而禁止某种测试得测试方法依然会被创建测试实例。
如果你想让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
方法。
2.10.1、改变默认得测试实例生命周期
如果测试类和测试接口上没有使用@TestInstance
,JUnit Jupiter
就会使用默认得生命周期模式。标准得默认模式是PER_METHOD
;然而,也可以在整个测试计划中改变这个默认模式。要更改默认的测试实例生命周期模式,将junit.jupiter.testinstance.lifecycle.default
配置参数设置为TestInstance.Lifecycle
中定义的enum
常量的名称,可忽略大小写。这可以作为JVM
系统属性提供,也可以作为传递给启动程序的LauncherDiscoveryRequest
中的配置参数提供,或者通过JUnit
平台配置文件提供。
比如,你可以通过下面系统变量来设置默认测试生命周期模式为Lifecycle.PER_CLASS
。
-Djunit.jupiter.testinstance.lifecycle.default=per_class
注意,通过JUnit Platform
配置文件设置默认得测试生命周期更加具有健壮性。因为,配置文件可以随项目一起检入版本控制系统,因此可以在ide
和构建软件中使用。
为了通过JUnit Platform
配置文件来设置默认得测试生命周期模式为Lifecycle.PER_CLASS
,你需要创建一个名称为junit-platform.properties
,并放在class path
得根目录下,比如:src/test/resources
。并在文件中输入:
junit.jupiter.testinstance.lifecycle.default = per_class
如果不一致地应用默认测试实例生命周期模式,则可能导致不可预测的结果和脆弱的构建。比如,你使用
per-class
来构建,但在IDE
中使用per-method
来测试,这样在构建服务器上就很难debug
找到错误。因此,这里建议使用JUnit Platform
配置文件来配置,而不是通过JVM
系统属性来配置。