【问题标题】:How to look for JUnit and TestNG tests with no assertions?如何查找没有断言的 JUnit 和 TestNG 测试?
【发布时间】:2011-10-05 14:02:41
【问题描述】:

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

【问题讨论】:

    标签: java unit-testing junit testng


    【解决方案1】:

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

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

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

    问候, 纳根德拉

    【讨论】:

      【解决方案2】:

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

      在运行时

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

      静态分析

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

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

      【讨论】:

      • 我已经有一些东西反映了测试代码并找出了哪些是测试方法(这就是我能够找出哪些测试没有运行的方法)。看起来“javap -c”的输出可以帮助确定哪些测试有断言,甚至是那些期待异常的测试(旧方法会调用“Assert.fail”并且可能是断言,而新方法有调用'ExpectedException.expect')。这至少适用于具有直接断言而不是间接断言的测试。恕我直言,无论如何,断言应该是直接的。
      【解决方案3】:

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

      【讨论】:

      • 当然,通常有一个隐含的断言——断言(不抛出异常)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2019-01-22
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多