覆盖率指标不考虑没有测试的代码?
Coverage metrics do not consider code without tests?
在一些组件具有测试覆盖率而其他组件没有的项目中,SonarQube 似乎仅根据具有覆盖率的组件计算总代码覆盖率。我希望没有测试覆盖率的组件中的代码行被归类为(至少对于计算)具有 0% 的代码覆盖率。
示例:
- 项目 X
- 模块 1:100% 覆盖率
- 模块 2:N/A 覆盖率(我认为这相当于计算中的 0%!)
SonarQube 覆盖率(项目 X):100%
总覆盖率是如何计算的?如果这是设计使然,为什么?
覆盖率是根据测试执行期间覆盖的行计算的。如果您没有测试,则会跳过测试执行,根本不会执行任何代码,因此不会生成任何覆盖率数据。所以N/A和0%
是有区别的
如果您向模块添加一个空测试,它将用于计算并产生 0% 的覆盖率作为结果。
编辑:
假设您使用 Jacoco 进行覆盖。 Jacoco 将覆盖率信息写入文件(即 jacoco.exec
)。对于单元测试(maven surefire),此文件被写入模块的目标目录,并使用该文件为该模块计算覆盖率。没有文件,没有报道。
当我 运行 集成测试时,我想确定整个项目的代码的哪些部分被测试覆盖。我的集成测试通常也位于单独的模块中。因此,在这种情况下,每个模块的覆盖率没有多大意义,因为测试(1 个模块)和产品(所有其他模块)是分开的。
所以我 运行 集成测试并将覆盖率信息写入单个 jacoco-it.exec
文件到根模块(项目)的目标文件夹中。结果,计算了整个代码库的覆盖率,包括覆盖率为 0% 的模块(有关如何设置,请参见此处:Multi-Module Integration Test Coverage with Jacoco and Sonar)
这种方法的缺点是,单个模块的哪些代码部分被该单个模块的测试所覆盖。因为一个模块的某些部分可以被另一个模块的测试覆盖,即一个模块的覆盖率可以达到 30%,而无需对该模块进行任何测试。
所以你可以选择:
- 每个模块的详细覆盖率,无测试模块具有 N/A 覆盖率
- 整个项目的总覆盖率,无测试模块的覆盖率为 0%,但没有模块的确切覆盖率信息
- 两者:分别使用两种方法进行单元测试和集成测试
在一些组件具有测试覆盖率而其他组件没有的项目中,SonarQube 似乎仅根据具有覆盖率的组件计算总代码覆盖率。我希望没有测试覆盖率的组件中的代码行被归类为(至少对于计算)具有 0% 的代码覆盖率。
示例:
- 项目 X
- 模块 1:100% 覆盖率
- 模块 2:N/A 覆盖率(我认为这相当于计算中的 0%!)
SonarQube 覆盖率(项目 X):100%
总覆盖率是如何计算的?如果这是设计使然,为什么?
覆盖率是根据测试执行期间覆盖的行计算的。如果您没有测试,则会跳过测试执行,根本不会执行任何代码,因此不会生成任何覆盖率数据。所以N/A和0%
是有区别的如果您向模块添加一个空测试,它将用于计算并产生 0% 的覆盖率作为结果。
编辑:
假设您使用 Jacoco 进行覆盖。 Jacoco 将覆盖率信息写入文件(即 jacoco.exec
)。对于单元测试(maven surefire),此文件被写入模块的目标目录,并使用该文件为该模块计算覆盖率。没有文件,没有报道。
当我 运行 集成测试时,我想确定整个项目的代码的哪些部分被测试覆盖。我的集成测试通常也位于单独的模块中。因此,在这种情况下,每个模块的覆盖率没有多大意义,因为测试(1 个模块)和产品(所有其他模块)是分开的。
所以我 运行 集成测试并将覆盖率信息写入单个 jacoco-it.exec
文件到根模块(项目)的目标文件夹中。结果,计算了整个代码库的覆盖率,包括覆盖率为 0% 的模块(有关如何设置,请参见此处:Multi-Module Integration Test Coverage with Jacoco and Sonar)
这种方法的缺点是,单个模块的哪些代码部分被该单个模块的测试所覆盖。因为一个模块的某些部分可以被另一个模块的测试覆盖,即一个模块的覆盖率可以达到 30%,而无需对该模块进行任何测试。
所以你可以选择:
- 每个模块的详细覆盖率,无测试模块具有 N/A 覆盖率
- 整个项目的总覆盖率,无测试模块的覆盖率为 0%,但没有模块的确切覆盖率信息
- 两者:分别使用两种方法进行单元测试和集成测试