做测试 "remember"?独立
Do tests "remember"? independency
我想标题可能有点混乱,希望您在解释后能够理解我的问题。
我想在 java 中编写一个 JUnit 测试 class。我在构造函数中创建了一个空列表。假设一种测试方法向该列表添加一个元素,如果该列表中有 1 个元素,则 returns 为真。如果列表为空,另一种测试方法只是 returns true。这些测试彼此独立工作吗?
这取决于测试框架、版本和设置。
在 JUnit 4 中,class 的单个实例用于 运行 class 中的所有测试。这意味着是的,测试会记住。
在 JUnit 5 中,默认情况下会为每个测试创建一个新实例。这包括参数化测试——这就是为什么(默认情况下)参数工厂方法需要静态的原因,因为还没有实例来提供参数。
您可以使用 @TestInstance(Lifecycle.PER_CLASS)
更改行为以再次对所有测试使用单个实例。
正如 QBrute 在评论中所说,测试 应该 独立工作。这意味着如果您的测试 class 保持状态,则应重置该状态。 JUnit 5 为此使用 @BeforeEach
和 @AfterEach
。最好使用 @BeforeEach
,因为 state-reset 中的失败不会导致另一个测试失败。
所以:
@BeforeEach
void initializeList() {
myList = new ArrayList<>();
// now every test has its own fresh list
}
我想标题可能有点混乱,希望您在解释后能够理解我的问题。
我想在 java 中编写一个 JUnit 测试 class。我在构造函数中创建了一个空列表。假设一种测试方法向该列表添加一个元素,如果该列表中有 1 个元素,则 returns 为真。如果列表为空,另一种测试方法只是 returns true。这些测试彼此独立工作吗?
这取决于测试框架、版本和设置。
在 JUnit 4 中,class 的单个实例用于 运行 class 中的所有测试。这意味着是的,测试会记住。
在 JUnit 5 中,默认情况下会为每个测试创建一个新实例。这包括参数化测试——这就是为什么(默认情况下)参数工厂方法需要静态的原因,因为还没有实例来提供参数。
您可以使用 @TestInstance(Lifecycle.PER_CLASS)
更改行为以再次对所有测试使用单个实例。
正如 QBrute 在评论中所说,测试 应该 独立工作。这意味着如果您的测试 class 保持状态,则应重置该状态。 JUnit 5 为此使用 @BeforeEach
和 @AfterEach
。最好使用 @BeforeEach
,因为 state-reset 中的失败不会导致另一个测试失败。
所以:
@BeforeEach
void initializeList() {
myList = new ArrayList<>();
// now every test has its own fresh list
}