【问题标题】:Coverage metrics do not consider code without tests?覆盖率指标不考虑没有测试的代码?
【发布时间】:2016-10-31 18:32:54
【问题描述】:

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

示例:

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

SonarQube 覆盖率(项目 X):100%

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

【问题讨论】:

    标签: sonarqube code-coverage sonarqube-scan


    【解决方案1】:

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

    是有区别的

    如果在模块中添加一个空测试,它将用于计算并产生 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%,但没有按模块的准确覆盖率信息
    • 两者:分别使用两种方法进行单元测试和集成测试

    【讨论】:

    • 嗨,我理解其中的区别,以不同的方式可视化 0 和 N/A 非常有意义,但是在总结覆盖率时,如果“跳过”没有覆盖率的模块很容易得出错误的结论。作为一名开发人员,我会看着这些数字说:“是的,我们有很好的覆盖范围,这里无事可做。”如果按照我的建议计算,就会发现覆盖率很低,然后进一步调查,发现有模块没有覆盖率
    • 你需要计算整个项目的覆盖率,但是你按模块丢失了信息,我相应地编辑了响应
    • 感谢您的详细回复。即使我不完全满意 SonarQube 的处理方式,我也会接受这个答案。最好有某种迹象表明覆盖数据不完整或相似。
    • 对于 SonarQube 中的几个语言插件,现在可以声明是否应将无覆盖率解释为 0% 覆盖率。感谢这个(SonarSource)!请将其添加到所有语言插件中(例如,5.6.5 LTS 版本的 C/C++/Objective-C 插件是不可能的)
    • Alix,能否请您指出一些有关此功能的文档?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2012-01-18
    • 2017-03-06
    • 2023-03-04
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多