如何使所有单元测试失败

时间:2012-10-10 13:48:52

标签: java unit-testing

我想找到永不失败的单元测试(用JUnit编写)。即有类似

的测试
try {
// call some methods, but no assertions
} catch(Throwable e) {
// do nothing
}

这些测试基本没用,因为它们永远不会在代码中发现问题。那么有没有办法让每个(有效的)单元测试失败?例如,对任何assert方法的每次调用都会抛出异常?然后仍然保持绿色的测试是无用的。

6 个答案:

答案 0 :(得分:1)

如果您尝试对每个 Assert方法进行每次调用失败,那么我不确定如何帮助您。 @ JonSkeet对Jester的建议可能接近你想要的。

但是,如果您尝试找到始终失败的 Assert方法,Assert.fail就是您想要的。它会在调用时抛出AssertionError

答案 1 :(得分:1)

嗯,一种方法是使用Jester之类的东西来实现mutation testing。它并没有像你建议的那样做,但它试图找到仍会通过的测试,但是你会改变生产代码,但随机改变它并重新运行测试。

答案 2 :(得分:1)

我假设您要跟踪吞下断言的代码,和/或不做任何断言。最简单的方法是构建自己的JUnit JAR,用自己的类替换原来的Assert类。

这不会帮助您找到断言是假的情况,如果您处于开发人员不打算断言的环境中,您也可能会出现伪造断言。它也无法帮助您找到标有@Ignore的测试,但 grep 会为您执行此操作。

答案 3 :(得分:0)

将此添加为默认测试实现:

Assert.assertTrue(false);

以这种方式开始的每个测试都将失败,直到用适当的东西替换该行。

答案 4 :(得分:0)

我不确定你想要什么,但我知道单位已经写好了,所以我能想象的唯一方法是覆盖断言方法,但即便如此,你还是要改变一下这个单位代码。

答案 5 :(得分:0)

使用以下配置对JUnit源运行CheckStyle

<module name="IllegalCatch">
    <property name="illegalClassNames" value="java.lang.Throwable, java.lang.Error, java.lang.AssertionError"/>
</module>