3

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

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

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

4

6 回答 6

1

如果您试图使对每种方法的每次调用都失败,那么我不确定如何为您提供帮助。@JonSkeet 对 Jester 的建议可能与您想要的很接近。 Assert

但是,如果您试图找到一种 Assert总是失败的方法,那Assert.fail就是您想要的。它引发了一个AssertionError调用。

于 2012-10-10T13:50:26.650 回答
1

好吧,一种方法是使用Jester之类的东西来实现突变测试。它并没有按照您建议的方式做事,但它会尝试找到仍然可以通过的测试,无论您更改生产代码多少,但会随机改变它并重新运行测试。

于 2012-10-10T13:51:12.887 回答
1

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

这不会帮助您找到断言是虚假的情况,并且如果您处于开发人员不费心断言的环境中,那么您也可能会遇到虚假断言。它也不能帮助您找到标有 的测试@Ignore,但grep会为您完成。

于 2012-10-10T14:09:05.927 回答
0

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

Assert.assertTrue(false);

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

于 2012-10-10T13:50:48.493 回答
0

我不确定你想要什么,但我知道单位已经写好了,所以我能想象的唯一方法是重写断言方法,但即使这样你也必须稍微改变一下单位代码。

于 2012-10-10T13:51:22.637 回答
0

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

<module name="IllegalCatch">
    <property name="illegalClassNames" value="java.lang.Throwable, java.lang.Error, java.lang.AssertionError"/>
</module>
于 2012-10-10T13:57:26.577 回答