【问题标题】:"No information about coverage per test." from Sonar with Jacoco Ant build“没有关于每次测试覆盖率的信息。”来自 Sonar 和 Jacoco Ant 构建
【发布时间】:2013-05-13 00:09:14
【问题描述】:

我正在使用 Ant、Jacoco 和 Sonar。当我运行我的构建时,Sonar 告诉我“没有关于每次测试覆盖率的信息”。声纳仪表板有我的覆盖结果,但我无法深入研究它们以查看代码。但是,Jacoco 生成的 HTML 报告确实包含对代码的深入分析。这是我的报道任务:

    <jacoco:coverage destfile="${coverage.output.file}" >
        <junit printsummary="on" 
            errorProperty="test.failed" 
            failureProperty="test.failed" 
            haltonfailure="yes" 
            fork="true">
            <formatter type="brief" usefile="false" />
            <formatter type="xml" />
            <classpath>
                <path refid="test.build.class.path"/>
                <pathelement location="${test.bin.dir}"/>       
            </classpath>
            <batchtest todir="${results.dir}">
                <fileset dir="${test.bin.dir}">
                    <include name = "**/**/*Test.class"/>
                </fileset>
            </batchtest>
        </junit>
    </jacoco:coverage>  

    <jacoco:report>
        <executiondata>
            <file file="${coverage.output.file}"/>
        </executiondata>
        <structure name="${ant.project.name}">
            <classfiles>
                <fileset dir="${bin.dir}"/>
            </classfiles>
            <sourcefiles encoding="UTF-8">
                <fileset dir="${src.dir}"/>
            </sourcefiles>
        </structure>
        <html destdir="${coverage.results.dir}"/>
    </jacoco:report>
</target>

我的声纳目标看起来像这样:

<target name="sonar" depends = "run">
    <property name="sonar.jdbc.url" value="..." />
    <property name="sonar.jdbc.username" value="...r" />
    <property name="sonar.jdbc.password" value="..." />

    <property name="sonar.projectKey" value="org.codehaus.sonar:example-java-ant" />
    <property name="sonar.projectName" value="${ant.project.name} (ant)" />
    <property name="sonar.projectVersion" value="1.0" />
    <property name="sonar.language" value="java" />
    <property name="sonar.sources" value="${src.dir}" />
    <property name="sonar.binaries" value="${bin.dir},${test.bin.dir}" />
    <property name="sonar.libraries" value="${lib.dir}/*.jar" />    

    <property name="sonar.dynamicAnalysis" value="reuseReports" />
    <property name="sonar.surefire.reportsPath" value="${results.dir}" />
    <property name="sonar.java.coveragePlugin" value="jacoco" />
    <property name="sonar.jacoco.reportPath" value="${coverage.output.file}" />

    <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
         <classpath>         
            <fileset dir="${lib.dir}" includes="sonar-ant-task-2.0.jar"/>
         </classpath>
    </taskdef>   

    <sonar:sonar />     
</target>

有人知道我错过了什么吗?

【问题讨论】:

    标签: java ant junit sonarqube jacoco


    【解决方案1】:

    sonar.test 属性应设置为测试类。我们的 maven pom 中有以下内容。对于 ANT,您可以执行类似的操作:

        <profile>
            <id>sonarprofile</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <sonar.host.url>....our host..../sonar.host.url>
                <sonar.projectKey>....our key....</sonar.projectKey>
                <sonar.projectName>${project.artifactId}</sonar.projectName>
                <sonar.projectVersion>${project.version}</sonar.projectVersion>
                <sonar.language>java</sonar.language>
                <sonar.sources>src/main/java</sonar.sources>
                <!-- sonar.tests>target/test-classes</sonar.tests -->
                <!-- that is the default location for Maven projects and -->
                <!-- this parameter can't actually be set in that case -->
                <sonar.scm.provider>git</sonar.scm.provider>
                <sonar.login>${SONAR_LOGIN}</sonar.login>
                <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
                <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
                <sonar.jacoco.reportPath>${basedir}/target/coverage-reports/jacoco-unit.exec</sonar.jacoco.reportPath>
            </properties>
        </profile>
    

    顺便说一句,这里还使用了一些其他属性:

    • 我通过我的 sonar 用户生成了一个 SONAR 令牌,而不是使用登录名和密码
    • JaCoCo 覆盖范围是使用jacoco-maven-plugin 单独生成的,sonar.jacoco.reportPath 是该插件中使用的属性。

    David Racodon 的回答 (https://stackoverflow.com/a/16645108/1019307) 曾经是正确的,但在 2014 年年中,SonarQube 停止执行测试作为声纳执行的一部分 (http://www.sonarqube.org/unit-test-execution-in-sonarqube/)。因此,为什么指向测试源不再有效。

    【讨论】:

    • 它是 sonar.tests,而不是 sonar.test 另外:“与 Maven 不兼容,它从 Java Maven 项目的默认位置检索测试。”见docs.sonarqube.org/display/SONAR/Analysis+Parameters
    • 好的,这是一个参数错误(尽管它确实对我有用)。虽然它实际上并没有错,但它是多余的。这是拒绝投票的理由吗?一个简单的评论会让我更新我的答案。
    【解决方案2】:

    您似乎没有设置“sonar.tests”属性来告诉 Sonar 在哪里可以找到您的单元测试的源代码。见http://docs.sonarqube.org/display/SONAR/Analysis+Parameters

    大卫·拉科顿 |声纳源

    【讨论】:

    • 我确认 - 在我的情况下,这被设置为测试源,而它应该指向已编译的类。
    • 我尝试添加 sonar.tests 属性以同时指向源代码和字节码。都没有奏效。我仍然对此感到困惑。
    • 我也有同样的问题。我认为这可能是 Ant 任务的一个错误,因为我使用 Sonar Runner 完成了这项工作,并且工作正常,但是 Ant 中的相同属性失败了。
    • 在 gradle 构建中也会发生。
    • 你没有尝试添加这个属性:sonar.jacoco.itReportPath=target/jacoco-it.exec 吗?
    猜你喜欢
    • 2015-10-15
    • 2018-12-23
    • 2015-02-02
    • 2015-01-07
    • 2012-06-11
    • 2015-05-11
    • 2016-01-16
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多