SonarQube不会通过Gradle显示每个文件的完整覆盖类的详细报告

bar*_*uin 5 java intellij-idea gradle jacoco sonarqube

我在IntelliJ Java IDE中运行Gradle构建.该SonarQube亚军摇篮插件与一起使用JaCoCo摇篮插件.

问题:我收到了消息No information about coverage per test.,(不是这篇文章的副本,见下文),并且报道显示在SonarQube中,但仅作为整体百分比,而不是每个文件的详细报告:

SonarQube测试覆盖范围视图

难道我做错了什么?这可能是SonarQube中的一个错误(就像最近的Cobertura一样)?

这是我的build.gradle:

repositories {
    mavenCentral()
}

apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'sonar-runner'

sourceCompatibility = 1.7
project.version = '1.0'
project.group = 'com.acme.sandbox'
project.description = 'just a test project'

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

// JaCoCo test coverage configuration
tasks.withType(Test) { task ->
    jacoco {
        append = false
    }
}

// Sonar configuration
sonarRunner {
  sonarProperties {
    property 'sonar.host.url', 'http://host:port'
    property 'sonar.jdbc.url', 'myJdbcURL'
    property 'sonar.jdbc.username', 'dbuser'
    property 'sonar.jdbc.password', 'dbpass'
    property 'sonar.login', 'builduser'
    property 'sonar.password', 'buildpass'

    property 'sonar.profile', 'profilename'
    property 'sonar.branch', 'DEV'
    property 'sonar.language', 'java'
    property 'sonar.sourceEncoding', 'UTF-8'
    property 'sonar.verbose', 'true'
    //property 'sonar.tests', "$projectDir\\src\\test\\java"
    //property 'sonar.binaries', "${buildDir}\\classes\\main,${buildDir}\\classes\\test"

    //property 'sonar.java.coveragePlugin', 'jacoco'
    property 'sonar.jacoco.reportPath', "${buildDir}\\jacoco\\test.exec"
    property 'sonar.junit.reportsPath', "${buildDir}\\test-results"
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果执行a clean,后跟sonarRunner,则会创建并处理JaCoCo test.exec文件:

<snip>
18:35:27.705 DEBUG - Initializers : 
18:35:27.706 INFO  - Base dir: D:\path\to\JaCoCoTest
18:35:27.706 INFO  - Working dir: D:\path\to\JaCoCoTest\build\sonar
18:35:27.707 INFO  - Source dirs: D:\path\to\JaCoCoTest\src\main\java
18:35:27.708 INFO  - Test dirs: D:\path\to\JaCoCoTest\src\test\java
18:35:27.708 INFO  - Binary dirs: D:\path\to\JaCoCoTest\build\classes\main
<snip>
18:35:27.931 INFO  - JaCoCo IT report not found.
18:35:27.933 INFO  - JaCoCo reports not found.
18:35:27.938 DEBUG - Sensors : JavaSquidSensor -> QProfileSensor -> FindbugsSensor -> CpdSensor -> PmdSensor -> SurefireSensor -> CheckstyleSensor -> InitialOpenIssuesSensor -> ProfileEventsSensor -> ProjectLinksSensor -> VersionEventsSensor -> FileHashSensor -> JaCoCoSensor
<snip>
18:35:34.055 INFO  - Sensor SurefireSensor...
18:35:34.056 INFO  - parsing D:\path\to\JaCoCoTest\build\test-results
18:35:34.116 INFO  - Sensor SurefireSensor done: 61 ms
<snip>
18:35:34.936 INFO  - Sensor JaCoCoSensor...
18:35:34.939 INFO  - Analysing D:\path\to\JaCoCoTest\build\jacoco\test.exec
18:35:35.027 INFO  - No information about coverage per test.
18:35:35.028 INFO  - Sensor JaCoCoSensor done: 92 ms
Run Code Online (Sandbox Code Playgroud)

这篇文章建议设置sonar.tests,我试图没有效果.日志文件显示检测到测试源和二进制文件位于正确的位置.

FWIW,我使用与Maven构建相同的设置并且它起作用.虽然不能在这里使用Maven.

版本号:

  • SonarQube 4.3
  • SonarQube Java生态系统2.2.1
  • Gradle 1.12(同时:1.11)
  • IntelliJ IDEA Ultimate 13.1.3
  • Java 1.7

这是完整的下载测试项目,也是完整的日志.

Zuz*_*zEL 4

这就是所谓的“想要的”行为。声纳不显示 100% 覆盖率的类别。在您的项目中,您有一个类完全被测试覆盖,所以没有什么可显示的。

供参考:

即使您有 100% 覆盖类别,您也可以通过在声纳搜索框(右上角)中搜索来查看该类别覆盖范围。


如果您看到.exec并且它的大小很有价值,那么您已经收集了覆盖率数据。

查看我的常见问题解答

我为您的项目提供了这个代码分析小部件:在此输入图像描述

最后,在我添加了另一种测试未发现的方法后,测试覆盖率下降到 80%: 在此输入图像描述

我得到了你所需要的 - 按行覆盖:在此输入图像描述

顺便说一下,你为我的声纳修改的build.gradle(这//对我不起作用):

repositories {
    mavenCentral()
}

apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'sonar-runner'


sourceCompatibility = 1.7
project.version = '1.0'
project.group = 'com.acme.sandbox'
project.description = 'just a test project'

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

// JaCoCo test coverage configuration
tasks.withType(Test) { task ->
    jacoco {
        append = false
    }
}

// Sonar configuration
sonarRunner {
    sonarProperties {
        // general information about the SonarQube server
        property 'sonar.host.url', 'http://localhost:9000'
        property 'sonar.jdbc.url', 'jdbc:h2:tcp://localhost:9092/sonar'
        property 'sonar.jdbc.validationQuery', 'select 1'
        property 'sonar.jdbc.driverClassName', 'org.hibernate.dialect.H2Dialect'
        property 'sonar.jdbc.password', 'sonar'
        property 'sonar.jdbc.password', 'sonar'
        property 'sonar.login', 'jenkins'
        property 'sonar.password', 'jenkins'

        // information about this project
        //property 'sonar.profile', 'profilename'
        property 'sonar.branch', 'DEV'
        property 'sonar.language', 'java'
        property 'sonar.sourceEncoding', 'UTF-8'
        property 'sonar.verbose', 'true'
        //property 'sonar.tests', "$projectDir\\src\\test\\java"
        property 'sonar.binaries', "${buildDir}/classes/main/"

        // execute JaCoCo before the SonarQube run to have report file ready
        //property 'sonar.java.coveragePlugin', 'jacoco'
        property 'sonar.jacoco.reportPath', "${buildDir}/jacoco/test.exec"
        property 'sonar.junit.reportsPath', "${buildDir}/test-results"
    }
}
Run Code Online (Sandbox Code Playgroud)