7

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

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


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

assert data != null;

Cobertura 将覆盖范围报告为:

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

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

4

2 回答 2

10

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

对于每个 Javaassert语句,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 覆盖范围和 assert 关键字

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

于 2011-07-15T08:11:02.587 回答
3

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

于 2011-02-24T23:53:02.743 回答