java - JUnit 测试相互影响

标签 java intellij-idea gradle junit

我正在处理大量遗留代码。首先是一个 JUnit-TestSuite。使用 gradle 运行所有测试时,它们都失败了。在 IntelliJ 中运行测试时,它们起作用了。我们将 gradle 配置为使用测试套件。

现在有人报告测试在没有 gradle 的情况下在本地工作,但没有 gradle。是时候解决这个烂摊子了。

是否有一种聪明的方法来确定哪个测试留下了一些配置或者哪些测试依赖于其他测试?

最佳答案

这种从一个测试“渗入”到另一个测试的最可能原因是可变的静态值。默认情况下,所有测试都由同一个 JVM 运行,因此被一个测试“突变”的静态变量在另一个测试中将是“脏的”。

可变静态是邪恶的!我正在处理一个代码库,目前到处都是可变的静态变量,而且一团糟。如果可能,您应该重构以使用依赖注入(inject)并在实例中而不是静态中存储可变状态。

最好的解决方法是找到“弄脏”静态可变变量的测试并执行

@After
public void cleanup() {
  SomeStatic.reset();
}

如果找不到导致问题的“脏”测试,您可能被迫在“失败”测试中执行以下操作。这不是首选,而且有点 hacky

@Before
public void cleanBefore() {
   SomeStatic.reset();
}

但这有轻微的代码“味道”。最好找到“弄脏”可变静态的有问题的测试

“核”选项是在其自己的 jvm 中运行每个测试。这是一个彻头彻尾的 hack,应该不惜一切代价避免。它将大大增加运行测试所需的时间

test {
   forkEvery = 1
}

参见 Test.forkEvery

关于java - JUnit 测试相互影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42442016/

相关文章:

java - 如何在 Gradle 中获取下一个内部版本号

android - gradle - 依赖项中的库重复

java - 如何使用 Guava 过滤具有多个值的 map 数组

java - 获取: Remove this Redundant Jump in SonarQube

intellij-idea - Intellij - 如何将文本文件添加到资源中

intellij-idea - 如何将intellij编译错误输出语言设置为英文?

eclipse - IntelliJ中的快捷键等效于Ctrl + Shift + G

gradle - Clojurephant的混合Clojure和ClojureScript构建

java - java变量的多态或改名

java - Spring JPA @NotNull 和 @JsonIgnore