如何在没有断言的情况下查找JUnit和TestNG测试?

时间:2011-07-14 18:02:03

标签: java unit-testing junit testng

我已经能够弄清楚如何寻找未运行的测试。有谁知道如何确定运行的测试是否没有断言?

3 个答案:

答案 0 :(得分:1)

我认为你有两个选择:在运行时,或使用静态分析。

在运行时

您可以使用JUnit的RunListener(TestNG具有类似的抽象)在运行时挂接您的测试,但是如何判断何时进行断言?不是直截了当的,但使用Java Agent可以做到这一点。您可以使用java代理和执行字节码操作的库来更改“断言”方法在加载到JVM中时的行为。您改变的方法必须调用RunListeners然后将其断言作为用法。你需要能够列出每一个算作“断言”的方法(junit?testng?hamcrest?等?)。唷!我过去做过这一切,它非常繁琐,但确实有效。

静态分析

在您的情况下,静态分析似乎是更好的选择。您可以扫描所有@Test注释(或等效的TestNG)的类路径,并检查它们中的哪一个调用名称以“assert”开头的方法。我已经使用javaparser来做类似的事情而且效果很好。

正如在另一个答案中所提到的,请注意总是存在隐式断言,即不会抛出任何异常。我们的套件中确实有一些有效且有用的测试,因此没有明确的断言。

答案 1 :(得分:1)

更简单的方法可能是JUnit和TestNG支持断言计数器,它不仅可以打印测试数量,还可以打印测试方法中使用的断言。

我为Assert类编写了一个包装器,它覆盖了所有方法并且有一个计数器..

您也可以尝试使用IntelliJ的结构化搜索

此致 Nagendra

答案 2 :(得分:0)

我说你最好的选择是正则表达式搜索或某种静态分析。无论哪个,它必须能够识别测试方法并确定它们是否包含断言,其中断言至少是一些断言*调用,模拟验证和/或“预期异常”条款。所有这些都构成某种“断言”。