为什么Cobertura无法报告断言分支路径?

时间:2011-02-24 23:35:59

标签: assert cobertura

Cobertura中,我无法报告断言语句的条件路径。这是一个已知的限制吗?

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


经过更多调查后,我发现正在检测到部分分支覆盖范围。问题是:

assert data != null;

和Cobertura报道的报道为:

  

条件覆盖率75%(3/4)[每种情况50%,100%]。

Cobertura期待的分支条件有哪些?

2 个答案:

答案 0 :(得分:10)

我遇到了同样的问题,所以我花了一些时间来反向设计答案,将其捐赠给Stack Overflow。

对于每个Java assert语句,Cobertura会跟踪两个条件:

  1. 是否在启用或禁用断言检查的情况下执行了给定的断言语句。
  2. 谓词实际上是评估为真还是假。
  3. 因此,总共有四种结果是可能的。提供的信息 对于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可以做到这一点,但我不知道有这个很好的功能的开源覆盖分析工具。

答案 1 :(得分:3)

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

相关问题