首页 文章

如何在SonarQube中获得每次测试的覆盖率?

提问于
浏览
2

我很难以某种方式设置我的项目,因此SonarQube报告每次测试的测试覆盖率 .

在使用Sonar Scanner进行分析时,我只看到了

No information about coverage per test.

在阅读了JaCoCo执行数据之后 .

这有什么要求?如何显示每个测试的覆盖范围的最小示例 .

我目前的环境如下:

  • SonarQube 6.4

  • SonarJava 4.12.0

  • 声纳扫描仪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

我错过了.1512391 . 也许文件需要以特定方式命名,例如测试结果(仅以Surefire格式获取 TEST-*.xml 报告)?

1 回答

  • 1

    感谢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);
        ...
    

    转储会话的ID必须是 testClassName testName 的形式(例如,在我的情况下,对于test1,它将是 tests.FooTestClass test1 ) . 只有这样,您才能在SonarQube中看到测试覆盖率信息 .

相关问题