【问题标题】:Why does Cobertura fail to report assert branch path was covered?为什么 Cobertura 没有报告断言分支路径被覆盖?
【发布时间】:2011-07-03 23:19:09
【问题描述】:

在Cobertura 中,我无法让它报告使用了断言语句的条件路径。这是已知的限制吗?

我有一个 JUnit 测试,它期望和 AssertionError 被抛出,并且它正确通过。问题是 Cobertura 报告断言分支没有被覆盖。


经过更多调查,我看到部分分支覆盖率正在被检测到。问题是:

assert data != null;

Cobertura 将覆盖范围报告为:

条件覆盖率 75% (3/4) [每个条件 50%、100%]。

Cobertura 期望的不同分支条件是什么?

【问题讨论】:

    标签: assert cobertura


    【解决方案1】:

    通过运行 JUnit 两次,我能够获得 100% 的覆盖率;一次启用断言,一次禁用断言。

    【讨论】:

    • 能否发布相关的 POM 配置(运行 JUnit 测试两次)?
    【解决方案2】:

    我遇到了同样的问题,所以我花了一些时间对答案进行逆向工程,并将其捐赠给 StackOverflow。

    对于每个 Java assert-statement,Cobertura 会跟踪两个条件:

    1. 给定的断言语句是在启用还是禁用断言检查的情况下执行的。
    2. 谓词的实际计算结果是真还是假。

    因此,总共可能有四种结果。提供的资料 HTML 报告中的给定行包含

    • 条件 1 的结果(从 2 中取出 0-2 种可能性,在启用或禁用检查的情况下解决执行问题),
    • 以及条件 2 的结果(从 2 中取出 0-2 种可能性:断言通过或失败)。
    • 总体结果(4 分中的 0-4 分),

    典型的场景是:

    • 运行 Cobertura 一次,断言检查禁用。 你会得到:
      启用/禁用:50%(禁用); 通过/失败:0%(未达到);因此总体为 25%。
      Cobertura 会将其报告为

      Conditional coverage 25% (1/4) [each condition 50%, 0%]

    • 运行一次 Cobertura,并启用断言检查。 通常你的断言总是正确的,因此你得到:
      启用/禁用:50%(启用); 通过/失败:50%(始终正确);因此总体而言:50%。

    • 运行 Cobertura 两次,一次带有断言检查 启用,一旦没有。 假设断言总是正确的,我们得到:
      启用/禁用:100%(启用和禁用); 通过/失败:50%(始终正确);因此总体为 75%。

    然后,如果我们添加测试用例来确保给定的断言 至少失败一次,至少通过一次,我们得到 所有数字均为 100%。

    但是,请注意,如果您按照约定的设计风格使用断言, 您通常甚至无法使它们失败, 查看另一个 Stack Overflow 问题的答案,Cobertura coverage and the assert keyword。

    最后:虽然这些数字是可以解释的,但我不确定它们是否非常有用。我的偏好是能够从整体报告中省略与断言相关的报道。 Clover 可以做到这一点,但我不知道有一个开源覆盖分析工具有这个好功能。

    【讨论】:

    • 哇!也许用 noop 替换所有断言语句的javac hack 可能有助于修复覆盖范围。请参阅scg.unibe.ch/staff/adriankuhn/javacompiler/forceassertions 了解如何完成。然而,最终 Cobertura 应该被修复为忽略断言。补丁,有人吗?
    • 抱歉,抢救报道报告——好主意!
    • 如果你对你的类进行单元测试,让断言失败应该不难。我想这取决于您在哪个级别进行单元测试。另外,我会警告不要将断言转换为无操作,因为您最终可能会在断言逻辑中隐藏错误。
    猜你喜欢
    • 2013-09-26
    • 2017-01-03
    • 2010-11-14
    • 1970-01-01
    • 2015-02-08
    • 2015-07-15
    • 1970-01-01
    • 2019-09-15
    • 2013-10-06
    相关资源
    最近更新 更多