【发布时间】: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*n(8 != 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 种可能的情况(输入):
- a != null, a.length > 0
- a != null, a.length
- a == null(第二个条件不能调整)
我知道 SonarQube 使用 Cobertura 或 JaCoCo 等其他工具进行覆盖,该工具负责上述问题,但我没有具体说明,因为我不知道。根据这些features,似乎覆盖工具可能是 Cobertura 或 JaCoCo,因为它们具有线和分支指标。
我想知道原理(他们如何决定使用这些指标)。
【问题讨论】:
标签: sonarqube code-coverage cobertura jacoco