覆盖率指标不考虑没有测试的代码?

时间:2016-06-29 07:26:51

标签: sonarqube code-coverage sonarqube-scan

在某些组件具有测试覆盖率但其他组件没有测试覆盖的项目中,似乎SonarQube仅根据具有覆盖范围的组件计算总代码覆盖率。我希望没有测试覆盖的组件中的代码行被分类(至少在计算中)为0%的代码覆盖率。

示例:

  • 项目X.
    • 第1单元:100%覆盖率
    • 模块2:N / A覆盖率(我认为这相当于计算中的0%!)

SonarQube覆盖范围(项目X):100%

如何计算总覆盖率?如果这是设计,为什么?

1 个答案:

答案 0 :(得分:3)

覆盖率是根据测试执行期间涵盖的行计算的。如果没有测试,则跳过测试执行,根本不执行任何代码,因此不会生成覆盖数据。所以 N / A 0%

之间存在差异

如果您向模块添加空测试,它将用于计算并产生0%的覆盖率。

修改 假设您使用Jacoco进行报道。 Jacoco将覆盖范围信息写入文件(即jacoco.exec)。对于单元测试(maven surefire),此文件将写入模块的目标目录,并使用该文件计算该模块的coverage。没有档案,没有报道。

当我运行集成测试时,我想确定测试涵盖整个项目代码的哪些部分。我的集成测试通常也位于单独的模块中。因此,在这种情况下,每个模块的覆盖范围并没有多大意义,因为测试(1个模块)和产品(所有其他模块)都是有效的。 所以我运行集成测试并将覆盖信息写入单个jacoco-it.exec文件到根模块(项目)的目标文件夹中。因此,计算整个代码库的覆盖范围,包括覆盖率为0%的模块(请参阅此处了解如何设置:Multi-Module Integration Test Coverage with Jacoco and Sonar

这种方法的缺点是,单个模块的代码的哪些部分由单个模块的测试覆盖。因为模块的某些部分可以通过另一个模块的测试来覆盖,即模块的覆盖率可以是30%而无需在该模块中进行任何测试。

所以你可以选择:

  • 每个模块的详细覆盖范围,无测试模块具有N / A覆盖率
  • 整个项目的总覆盖范围,无测试模块的覆盖范围为0%但模块没有确切的覆盖范围信息
  • 两者:分别使用两种方法进行单元测试和集成测试