JUnit 测试通过但 PIT 说套件不是绿色的

Posted

技术标签:

【中文标题】JUnit 测试通过但 PIT 说套件不是绿色的【英文标题】:JUnit tests pass but PIT says the suite isn't green 【发布时间】:2015-08-27 15:52:36 【问题描述】:

在尝试运行 PIT 突变测试时,我收到以下错误:

mutationCoverage failed: 在计算线路覆盖率时,所有测试都没有通过突变。突变测试需要绿色套件。

当我进行正常的测试构建时,测试运行得很好,但在运行突变测试阶段时,它们应该会失败,但没有提供有关原因的详细信息。我已经查看了PIT Testing FAQ 中列出的原因,但我仍然不知道可能出了什么问题。

我试过了:

将 -Dthreads=1 选项添加到任何多线程问题的规则中 找不到任何唯一失败的测试的系统属性 正常运行时不会忽略测试

我还应该尝试哪些其他事情?或者其他方式来调试这里可能发生的事情?

【问题讨论】:

您是否尝试启用vebose 登录 PIT 以获取有关失败测试的更多详细信息? 是的,我有。除了正常输出之外,额外的输出没有显示任何其他帮助。它仍然只有一个警告,表明测试类和测试方法失败“4:30:45 PM PIT >> WARNING : Description [testClass=com.bobbylough.RandomTest, name=testToResource(com.bobbylough.RandomTest)]没有突变就没有通过。” 【参考方案1】:

在覆盖阶段测试失败的常见原因是

    正常测试配置中未包含/排除 PIT 拾取测试 测试依赖于在测试配置中设置的环境变量或其他属性,但在最糟糕的配置中没有设置 测试具有隐藏的顺序依赖关系,在正常测试运行期间不会显示 PIT 不喜欢您的技术堆栈中的某些东西 - 可能是 JUnit 测试运行程序

听起来你已经消除了 1 和 2。所以剩下 3 和 4。

测试顺序依赖性可能很难发现。如果其中任何一个的答案是肯定的,那么您可能有一个。

您的代码库是否包含可变静态? (例如单例) 您的测试是否访问了一个数据库(内存中或其他),在该数据库中状态可能在测试之间保持不变? 您的测试是否会修改磁盘上的文件?

上面可能还有许多其他原因没有列出。

如果您确信您的代码库中不可能存在顺序依赖关系,那么这些特定测试就会出现问题。

如果没有一些代码,很难猜测这可能是什么。你能发布一个仍然失败的测试的简化版本吗?

【讨论】:

谢谢亨利。我会继续调试。你的权利,它可能是一个 maven 依赖问题,调试起来总是很有趣 “顺序依赖”是指当测试以特定顺序运行时,套件不会通过。即,如果套件按 A、B、C、D 的顺序运行测试,一切都很好,但如果 C 在 B 之前运行,你会发现 B 失败。当测试 C 更改 B 隐式依赖的 jvm 中的某些状态时,就会发生这种情况。 啊好吧,我明白你的意思了。遗憾的是,我没有一个失败的简化版本,因为它在我的项目中超过 4,000 个 JUNIT 测试中的两个上,我无法提炼出它们的独特之处。您为突变测试创建了一个很棒的工具。我会继续挖掘。它可能类似于我无法模拟的外部库中静态方法的系统属性。感谢您的帮助 @henry - 有什么方法可以将环境变量传递/设置到pit。在我的例子中,我们使用surefire插件来设置执行单元测试时要使用的环境变量。由于这个变量在运行测试时没有被传递给pit,所以测试失败了。请就此提出建议。谢谢 找到了将环境变量设置为坑插件配置的解决方案 - test

以上是关于JUnit 测试通过但 PIT 说套件不是绿色的的主要内容,如果未能解决你的问题,请参考以下文章

Java进阶 五 Junit测试

运行测试套件无法通过 maven 在 junit5 中运行

SpringJUnit4ClassRunner 与 JUnit 测试套件错误

同一对象的 JUnit 测试

Junit介绍以及shi

如何将JUnit 4测试添加到JUnit 3测试套件中