当前位置: 首页 > 知识库问答 >
问题:

雅各科分支覆盖和声纳状况覆盖有什么区别?

林鹭洋
2023-03-14

我正在尝试使用SonarQube扫描仪(版本3.1.0.1141)分析java代码。

  • 声纳Qube版本 : 5.6.6
  • 声纳Java插件版本: 4.12.0.11033
  • 哈科版本 : 0.8.0

我已经用这些属性填充了声纳项目属性:

# Sonar sources and metadata
sonar.language=java
sonar.sources=src/main
sonar.java.source=1.8
sonar.sourceEncoding=UTF-8
sonar.java.binaries=target/classes
sonar.java.libraries=target/lib

sonar.tests=src/test
sonar.java.coveragePlugin=jacoco
sonar.junit.reportsPath=target/surefire-reports
sonar.surefire.reportsPath=target/surefire-reports

而Jacoco报告给我一个类的结果:

  • 覆盖率:84%
  • 分支机构覆盖率:71%
  • 错过:9
  • 复杂性:24
  • 错过:6
  • 行数:69
  • 错过:0
  • 方法:8
  • 错过:0
  • 课程:1

SonarQube显示度量值:

    < li >条件覆盖率62.5% < li >覆盖率81.7% < li >线路覆盖率92.8% < li >覆盖69的线条 < li >总体条件覆盖率为62.5% < li >总体覆盖率81.7% < li >整体产品线覆盖率为92.8% < li >未覆盖分行总数15 < li >全部未覆盖线5 < li >未覆盖的分支15 < li >未覆盖的线5

根据声纳指标定义页面,声纳用于条件覆盖的关键branch_coverage,因此我认为条件和分支覆盖是相同的。

如何解释不同的结果?

共有1个答案

吕皓
2023-03-14

假设你有一些结构

if(a == 1 && b == 2) {
  //do this
} else {
  //do that
}

你有两个分支

  • 这样做
  • 那样做

和两个条件

  • a==1(cond1)
  • b==2(cond2)

如果你有两个测试用例

  • 测试(a==1,b==2)
  • 测试(a==2,b==2)

你覆盖了两个分支,因为(cond1的组合条件

但是你只完全覆盖了cond1,只有一半的cond2,这是75%的条件覆盖率。

要获得全面的条件覆盖,您需要额外的测试

  • 测试(a==1, b==1)

这两种工具都使用每条线路的分支信息来计算覆盖范围。我对我的一些代码进行了测试,并且“要覆盖的条件”(Sonarqube)的数量与Jacoco报告中的总“分支”数量相匹配 - 但我使用了最新版本的雅各和声纳库/声纳-java。因此,除了名称之外,但措施是/应该是相同的。

但是从你提供的数字来看,你的分析似乎有些奇怪。不仅百分比值不同,而且绝对值也不同(Jacoco有9个未覆盖的分支,Sonarqube有15个未覆盖的分支)。

所以我检查了你正在使用的版本——雅各科0.8.0和使用雅各科0.7.9的声纳java插件v4.11.0.11033。

Jacoco 0.8.0的发行说明如下:

在创建报告的过程中,各种编译器生成的工件被过滤掉,否则需要不必要的、有时是不可能的技巧来避免部分覆盖或遗漏覆盖:

  • 方法枚举类型的值和值(GitHub#491)
  • 私有空无参数构造函数(GitHub#529)
  • 用@lombok注释的方法。生成以更好地与Lombok集成

因此,我的最佳猜测是,Jacoco0.8.0生成的报告过滤掉了一些提到的生成工件,有效地减少了分支的总数。然而,SonarJava使用的是Jacoco0.7.9,它不过滤生成的工件,因此数量更高(覆盖率更低)。

也许您应该将您的Jacoco版本降级为0.7.9或升级sonar-java插件。

 类似资料:
  • 我使用jacoco来获取代码覆盖率指标,并使用声纳qube以及它来可视化它。 Jacoco拥有多个“子”覆盖范围 行 方法 分支 类 指示 但如果我们查看sonarqube,它只显示了一个“覆盖”信息。 sonarqube指的是上述5个覆盖范围中的哪一个?

  • 几天来,我一直在努力将JaCoCo的报告集成到SonarQube 5.0.1中。我总是在声纳曲中阅读0.0%的覆盖率。 TeamCity 9生成了一个testresults.xml和一个jacoco.exec文件,我将其用于声纳转轮。TeamCity显示覆盖范围,因此exec文件接缝很好。Java代码分析基本上在SonarQube(FindBugs、PMD等)中工作。 我有一个仍在使用Ant构建的

  • 我有一些使用try-with-resources的代码,在jacoco中,它只覆盖了一半。所有的源代码行都是绿色的,但我得到一个黄色的小符号,告诉我8个分支中只有4个被覆盖。 我无法弄清楚所有分支是什么,以及如何编写涵盖它们的代码。三个可能的地方抛出。这些是、和隐含的 不抛出任何异常, 我想不出任何其他案例,但我仍然只有8个案例中的4个。 有人能给我解释一下为什么它是8个中的4个,还有没有其他方法

  • 主要内容:如何计算分支覆盖范围?分支覆盖技术用于覆盖控制流图的所有分支。它至少涵盖决策点的每个条件的所有可能结果(真和假)。分支覆盖技术是一种白盒测试技术,可确保每个决策点的每个分支都必须执行。 然而,分支覆盖技术和决策覆盖技术非常相似,但两者之间存在关键差异。决策覆盖技术涵盖每个决策点的所有分支,而分支测试涵盖代码的每个决策点的所有分支。 换句话说,分支覆盖遵循决策点和分支覆盖边缘。许多不同的指标可用于查找分支覆盖范围和决策覆

  • 我需要一些帮助来估计某种形态学操作(最好使用skimage或scipy image或通常使用python),这些操作可以帮助我隔离由所有边包围的区域(参见Images.)问题是外壳可以有不同的形状和大小。封闭区域的形状和大小也各不相同。图像的例子,其中封闭的(由白色区域)黑色区域需要隔离。 通过隔离,我的意思是获得封闭的黑色区域中的所有像素坐标。 实施例1

  • 当我运行mvn干净测试时,我希望覆盖输出被写入目标/覆盖报告,但是当我打开index.html构建后它是空的。 我检查了以下内容,jacoco.exec文件存在,其中有一组类名-在覆盖率html中有一个链接“Sessions ”,当我单击它时,我看到一组我的类似乎已经被执行-当我运行maven命令时,我没有看到错误或警告 我很困惑为什么报告是空的。从我看到的所有例子来看,这似乎应该行得通。我错过了