【问题标题】:Sonar test coverage does not include indirect classes声纳测试覆盖率不包括间接类
【发布时间】:2015-06-02 15:26:12
【问题描述】:

如果我有以下类(A 和 B),它们都在一个单独的模块中,并且我为 A.doSomething() 创建了一个测试,Sonar 会抱怨 B.doSomething()0% 覆盖率,尽管它正在TestA 中进行间接测试。 使用Ecclema覆盖插件进行eclipse,我可以see B.doSomething()被认为是覆盖了。

Sonar 这样做有什么原因吗?有没有办法改变 Sonar 的代码测试覆盖率的行为以包含间接测试的类?

class A {
    boolean doSomething() {
        return new B().doSomething();
    }
}

class B {
    boolean doSomething() {
        return true;
    }
}

【问题讨论】:

  • 这应该可以工作,除非你的类在单独的模块/子项目中(目前没有跨模块覆盖率计算)。
  • @Mithfindel 是的,它们都在一个单独的模块中。没有可行的解决方法吗?

标签: java sonarqube


【解决方案1】:

您可以轻松实现您想要的。这是您如何配置 JaCoCo 的问题,因此它与 SonarQube 几乎没有关系。 例如,在 SonarQube Eclipse 项目中,我们需要它,因为单元测试位于单独的模块中。

所以我们已经将 JaCoCo 配置为对所有模块使用相同的转储文件(默认情况下,JaCoCo Maven 插件将为每个模块使用一个单独的转储文件): https://github.com/SonarSource/sonar-eclipse/blob/master/pom.xml#L373

然后我们将 SonarQube JaCoCo 插件配置为使用相同的报告: https://github.com/SonarSource/sonar-eclipse/blob/master/pom.xml#L357

【讨论】:

  • 我认为您误解了我的问题,而 Mithfindel 的回答似乎更正确。实际上我有一种测试方法,它只测试class A。在project A 中的这个测试中,来自project B 中的class B 的方法被调用。因此,这并不是真正的汇总报告,因为只有一项测试。这是关于 Jacoco 无法检测到间接调用的方法/类的覆盖范围,class B 就是这种情况。
  • 关于聚合报告,然后配置 SQ 分析以对所有模块使用相同的报告。使用默认行为,在 moduleA 上执行测试将在 moduleA/target 中生成一个覆盖率报告,其中包含 classA 和 classB 的覆盖率。执行 SQ 分析时,在分析 moduleA 时,它会读取 moduleA/target/jacoco.exec 以设置对 classA 的覆盖。在分析 moduleB 时,它在 moduleB/target 中查找覆盖率报告,但没有找到,因此在 classB 上没有报告覆盖率。如果您将分析配置为对所有应该工作的模块使用 moduleA/target/jacoco.exec。
  • 我发现了我的问题。实际上,Sonar 的插件正在删除生成的jacoco.exec 并重新创建一个不包含依赖项目的插件。你知道我怎样才能避免删除这样的文件吗?我使用了-Dsonar.dynamicAnalysis=reuseReports,它已被弃用,但似乎阻止了文件的删除
  • 你使用的SQ Java插件是什么版本的?
  • 我们使用的是 2.1,我们升级到 2.9.1,问题得到解决(我们不再需要添加 -Dsonar.dynamicAnalysis=reuseReports
猜你喜欢
  • 2013-10-14
  • 2016-11-10
  • 1970-01-01
  • 2019-11-01
  • 2014-04-09
  • 2017-02-11
  • 2016-05-24
  • 2013-11-21
  • 1970-01-01
相关资源
最近更新 更多