java - 如何在 SonarQube 中获取每个测试的覆盖率?

标签 java sonarqube code-coverage

我很难以某种方式设置我的项目,以便 SonarQube 报告每个测试的测试覆盖率。

在使用 Sonar 扫描仪进行分析时,我只是看到

No information about coverage per test.

读取JaCoCo执行数据后。

要实现此功能需要什么要求?显示每个测试覆盖率的最小示例看起来如何。

我当前的环境如下所示:

  • SonarQube 6.4
  • SonarJava 4.12.0
  • Sonar 扫描仪3.0.3
  • eclipse NEON
  • EclEmma 3.0.0/JaCoCo 0.7.9

我的测试项目如下所示:

Workspace
+- EclipseProject
|  +- bin
|  |  +- foo
|  |  |  +- FooClass.class
|  |  +- tests
|  |     +- FooTestClass.class
|  +- src
|     +- foo
|     |  +- FooClass.java // Class with getter/setter for a private 
|     |                   // instance variable.
|     +- tests
|        +- FooTestClass.java // Two JUnit 4 tests: test1 checks getter,
|                             //                    test2 checks setter.
|
+- xml
|  +- TEST-tests.xml // Export from Eclipse after combined test run, converted to fit Surefire format.
|
+- coverage
|  +- test1.exec // Session export from Eclipse after single test run.
|  +- test2.exec // Session export from Eclipse after single test run.
|
+- sonar-project.properties

如您所见,每个测试都存在执行数据。 sonar-project.properties 的内容如下所示:

sonar.projectKey=EclipseProject
sonar.projectName=EclipseProject
sonar.projectVersion=1.0.0-20170830
sonar.projectBaseDir=/path/to/Workspace
sonar.sources=src/foo/
sonar.tests=src/tests/
sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.java.source=1.8
sonar.java.binaries=bin/
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPaths=/absolute/path/to/coverage/test1.exec,/absolute/path/to/coverage/test2.exec
sonar.junit.reportPaths=/absolute/path/to/xml/
sonar.analysis.mode=publish

我不确定缺少什么。也许文件需要以特定方式命名,例如测试结果(仅选取 Surefire 格式的 TEST-*.xml 报告)?

最佳答案

感谢 Sonar Java 插件的开源,我发现了问题:

  private boolean analyzeLinesCoveredByTests(String sessionId,
                      ExecutionDataStore executionDataStore) {

    int i = sessionId.indexOf(' ');
    if (i < 0) {
      return false;
    }
    String testClassName = sessionId.substring(0, i);
    String testName = sessionId.substring(i + 1);
    InputFile testResource = javaResourceLocator
                                .findResourceByClassName(testClassName);
    ...

转储 session 的 ID 必须采用 testClassName testName 格式(例如,在我的例子中,test1 的形式为 tests.FooTestClass test1)。只有这样您才能在 SonarQube 中看到测试覆盖率信息。

关于java - 如何在 SonarQube 中获取每个测试的覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45958277/

相关文章:

java - Perforce值得吗?

java - 公共(public)静态变量的 SonarQube 问题 | JAVA

java - SONAR 实现是否将伴随类视为公共(public)类的一部分 - 指标

python - Jinja2 模板的代码覆盖率

visual-studio-2017 - 本地 Visual Studio 和 TFS 构建服务器中的代码覆盖率结果不匹配

java - 可以从 List 生成平面 XML 结构的 XStream 自定义转换器?

java - 使用 Java 反射创建原始类型/对象

java - 在 JTable 中显示各种对象的实例变量并修改它们

java - SonarQube 问题 "Add at least one assertion to this test case"用于带有断言的单元测试?

java - JaCoCo 字节码结果