做测试 "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
}