【发布时间】:2011-10-05 14:02:41
【问题描述】:
我已经能够弄清楚如何去寻找未运行的测试。有谁知道我可以如何确定运行的测试是否没有断言?
【问题讨论】:
标签: java unit-testing junit testng
我已经能够弄清楚如何去寻找未运行的测试。有谁知道我可以如何确定运行的测试是否没有断言?
【问题讨论】:
标签: java unit-testing junit testng
更简单的方法可能是 JUnit 和 TestNG 支持断言计数器,它不仅可以打印测试的数量,还可以打印测试方法中使用的断言。
我已经为 Assert 类编写了一个包装器,它覆盖了所有方法并有一个计数器..
您也可以尝试使用 IntelliJ 的结构化搜索
问候, 纳根德拉
【讨论】:
我认为你有两个选择:在运行时,或者使用静态分析。
在运行时
您将能够在运行时使用 JUnit 的 RunListener 挂钩您的测试(TestNG 具有类似的抽象),但是您如何知道何时做出断言?并不简单,但可以使用Java Agent。您可以使用 java 代理和执行字节码操作的库来改变“断言”方法在加载到 JVM 时的行为。您更改的方法必须调用您的 RunListeners,然后将它们的断言作为通常的断言。您需要能够列出每一个算作“断言”的方法(junit?testng?hamcrest?等?)。呸!我过去做过这一切,虽然很繁琐,但确实有效。
静态分析
在您的情况下,静态分析似乎是更好的选择。您可以扫描所有 @Test 注释(或 TestNG 等效注释)的类路径,并检查它们中的哪些调用名称以“assert”开头的方法。我用javaparser 做了类似的事情,效果很好。
正如另一个答案中提到的,请注意,始终存在不引发异常的隐式断言。我们的套件中确实有一些有效且有用的测试,因此没有明确的断言。
【讨论】:
我会说您最好的选择是正则表达式搜索或某种静态分析。无论如何,它必须能够识别测试方法并确定它们是否包含断言,其中断言至少是一些 assert* 调用、模拟验证和/或“预期异常”子句。所有这些都构成了某种“断言”。
【讨论】: