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

cmc*_*nty 7 assert cobertura

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

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


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

assert data != null;
Run Code Online (Sandbox Code Playgroud)

和Cobertura报道的报道为:

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

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

ava*_*sen 10

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

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

  1. 是否在启用或禁用断言检查的情况下执行给定的断言语句.
  2. 谓词实际上是评估为true还是false.

因此,总共有四种结果是可能的.为HTML报告中的给定行提供的信息包括

  • 条件1的结果(从2中取出0-2可能性,通过启用或禁用检查来解决执行),
  • 条件2的结果(0-2可能性取自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和assert关键字的答案.

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


cmc*_*nty 3

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

  • 您能否发布相关的 POM 配置(运行 JUnit 测试两次)? (2认同)