我想找到永不失败的单元测试(用JUnit编写)。即有类似
的测试try {
// call some methods, but no assertions
} catch(Throwable e) {
// do nothing
}
这些测试基本没用,因为它们永远不会在代码中发现问题。那么有没有办法让每个(有效的)单元测试失败?例如,对任何assert方法的每次调用都会抛出异常?然后仍然保持绿色的测试是无用的。
答案 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>