Java 如何寻找没有断言的JUnit和TestNG测试?

Java 如何寻找没有断言的JUnit和TestNG测试?,java,unit-testing,junit,testng,Java,Unit Testing,Junit,Testng,我已经能够找出如何着手寻找未运行的测试。有人知道我如何去弄清楚运行的测试是否没有断言吗?我认为最好的选择是正则表达式搜索或某种静态分析。无论如何,它必须能够识别测试方法并确定它们是否包含断言,其中断言至少是某个assert*调用、模拟验证和/或“预期异常”子句。所有这些都构成了某种“断言”。我认为您有两种选择:在运行时,或者使用静态分析 在运行时 您将能够在运行时使用JUnit钩住测试(TestNG有类似的抽象),但是您如何知道何时进行断言呢?这并不简单,但使用。您可以使用一个java代理和一个

我已经能够找出如何着手寻找未运行的测试。有人知道我如何去弄清楚运行的测试是否没有断言吗?

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

我认为您有两种选择:在运行时,或者使用静态分析

在运行时

您将能够在运行时使用JUnit钩住测试(TestNG有类似的抽象),但是您如何知道何时进行断言呢?这并不简单,但使用。您可以使用一个java代理和一个执行字节码操作的库来改变“断言”方法加载到JVM中时的行为。您更改的方法必须调用您的RunListener,然后将它们的断言作为usususal。您需要能够列出每一个算作“断言”的方法(junit?testng?hamcrest?等)。呸!我在过去做过所有这些,虽然很精细,但确实有效

静态分析

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


正如在另一个答案中提到的,请注意,始终存在没有抛出异常的隐式断言。我们的套件中确实有一些有效且有用的测试,因为它们没有明确的断言。

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

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

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

问候,,
Nagendra

当然,通常会有一个隐式断言(assert-assert)(没有抛出异常)。我已经有了一些反映测试代码的东西,并找出了哪些是测试方法(这就是我能够找出哪些测试没有运行的原因)。“javap-c”的输出似乎可以帮助找出哪些测试有断言,甚至是预期出现异常的测试(旧方法调用“Assert.fail”和断言,而新方法调用“ExpectedException.expect”)。这至少适用于具有直接断言而非间接断言的测试。总之,断言应该是直接的。