【问题标题】:How are the covered branches counted in SonarQube?SonarQube 中覆盖的分支如何计算?
【发布时间】:2015-04-10 15:37:05
【问题描述】:

示例 1

if ( a1 || a2 || ... || an ) {
    ...
}

Sonar 显示 0/2*n 分支已被测试覆盖。 (例如:0/6 代表 n=3

让我们来一个函数:

f:{a1,...,an}->{true,false}

函数的数量(=所有可能的组合)等于|{true,false}|^|{a1,...,an}| = 2^n,这明显不同于2*n8 != 6代表n=3)。也可以使用组合的总和来证明。

如果我们想这样写的话:

if ( a1 ) {
   ...
} else if ( a2 ) {
          ...
       } else if ( a3 ) {
          ...
       }
       ...

我们可以使用以下n 序列覆盖所有分支 - 例如n=3

  • T**
  • 英尺*
  • FFT

其中 T=True,F=False,*=不关心

问:那么,为什么会有2*n

示例 2

if ( a != null && a.length > 0 ) {
   ...
}

Sonar 显示 0/4 分支已被测试覆盖。

问:如何实现4/4?我只看到 3 种可能的情况(输入):

  1. a != null, a.length > 0
  2. a != null, a.length
  3. a == null(第二个条件不能调整)

我知道 SonarQube 使用 Cobertura 或 JaCoCo 等其他工具进行覆盖,该工具负责上述问题,但我没有具体说明,因为我不知道。根据这些features,似乎覆盖工具可能是 Cobertura 或 JaCoCo,因为它们具有线和分支指标。

我想知道原理(他们如何决定使用这些指标)。

【问题讨论】:

    标签: sonarqube code-coverage cobertura jacoco


    【解决方案1】:

    在 SonarQube 中,覆盖分支(我们在 Metrics Definition page 中称它们为“覆盖条件”)确实是由第三方工具提供的。 SonarQube 信任这些工具,因此它只是解析覆盖率报告,然后聚合“原始”数据来计算分支覆盖率。

    默认情况下,SonarQube 带有 JaCoCo(嵌入在 Java Plugin 中) - 但还有其他插件,例如 Cobertura plugin

    【讨论】:

      猜你喜欢
      • 2018-10-30
      • 2018-08-16
      • 2018-12-29
      • 2019-08-04
      • 1970-01-01
      • 2019-06-15
      • 2017-01-03
      • 2017-01-07
      • 2021-08-22
      相关资源
      最近更新 更多