ant - 如何让 Sonar 导出测试统计数据?

标签 ant junit sonarqube emma

我定义了以下 Sonar Ant 目标:

<target name='sonar'>
    <property name='sonar.sources' value='${src.dir}'/>
    <property name='sonar.tests' value='${test.src.dir}'/>
    <property name='sonar.binaries' value='build/classes'/>
    <path id='jars'>
        <fileset dir='${env.JAVA_HOME}/jre/lib' includes='*.jar'/>
        <fileset dir='build/lib/test' includes='*.jar'/>
    </path>
    <pathconvert property='sonar.libraries' refid='jars' pathsep=','/>

    <exec executable='p4' outputproperty='p4.P4CLIENT'>
        <arg value='set'/>
        <arg value='P4CLIENT'/>
    </exec>
    <propertyregex
            property='p4client'
            input='${p4.P4CLIENT}'
            regexp='P4CLIENT=([^ ]+) *.*'
            replace='\1'/>
    <propertyregex
            property='sonar.timestamp'
            input='${build.time}'
            regexp='_'
            replace='T'/>
    <sonar:sonar key='com.netflix:${module.name}' version='${p4client}@${sonar.timestamp}' xmlns:sonar='antlib:org.sonar.ant'/>

    <property name='sonar.dynamicAnalysis' value='reuseReports'/>
    <property name='sonar.emma.reportPath' value='${coverage.dir}'/>
</target>

当我运行 'ant sonar' 并在浏览器中调出 Sonar 时,我会在 src 目录中看到有关类的信息,但没有看到有关 test 目录中的内容的信息。

如果我将 ${test.src.dir} 添加到 sonar.sources 并且没有设置 sonar.tests,我会看到一些关于测试类的信息,但 Sonar 仍然报告 0 Test Successes。

我如何获得它以便我可以深入了解每个测试方法及其统计数据?

最佳答案

对于遇到此问题的其他人,我终于让 Sonar 报告了我们的 Emma Code 覆盖范围。第一个问题是 Emma 插件没有随我使用的 Sonar 版本(3.1.1)一起提供。我不得不download it并将其安装到 extensions/plugins Sonar 目录并重新启动它。

然后我必须在 build.xml 中设置以下属性:

<property name="sonar.core.codeCoveragePlugin" value="emma" />
<property name="sonar.emma.reportPath" value="${coverage.dir}" />

在此之后,我至少在运行 Sonar ant 任务后看到了以下输出:
[sonar:sonar] 13:41:49.705 WARN        org.sonar.INFO - No coverage (*.ec) file found in /my/local/path
[sonar:sonar] 13:41:49.708 WARN        org.sonar.INFO - No metadata (*.em) file found in /my/local/path

经过一番挖掘,我发现在Sonar Emma plugin里面,查找 .ec(覆盖范围)文件和 .em(元数据)文件是硬编码的。不幸的是,我的覆盖文件和元数据文件都有一个 .emma 扩展名,我无法重命名它们,因为它会破坏其他功能。所以我编写了以下 Ant 任务来复制文件以匹配 Sonar Emma 插件期望的命名标准。
<target name="createEmmaFilesWithSonarNamingStandard" depends="defineAntContribTasks">
    <if>
        <available file="${coverage.dir}/metadata.emma" />
        <then>
            <copyfile src="${coverage.dir}/metadata.emma" dest="${coverage.dir}/metadata.em" />
        </then>
    </if>
    <if>
        <available file="${coverage.dir}/coverage.emma" />
        <then>
            <copyfile src="${coverage.dir}/coverage.emma" dest="${coverage.dir}/coverage.ec" />
        </then>
    </if>
</target>

再次运行后,我遇到了一个新问题:
org.sonar.api.utils.SonarException: java.io.IOException: cannot read [/my/local/path/build/coverage/metadata.em]: created by another EMMA version [2.0.5312]

经过更多的挖掘,我发现 Sonar Emma 1.0.1 插件是针对 Emma 2.0.5312 编译的,Sonar Emma 1.1 和 1.2.x 是针对 Emma 版本 2.1.5320 编译的,如 Sonar Emma plugin 所述。页。

我下载的是2.1.5320版本的Emma,替换了emma.jar以及 emma_ant.jar在我的 Ant lib 目录中。经过干净的重新编译和测试后,我能够重新运行 Sonar Ant 任务,并将我的代码覆盖率反射(reflect)在 Sonar 上。

关于ant - 如何让 Sonar 导出测试统计数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7212769/

相关文章:

java - PowerMock,模拟使用静态方法的类的方法抛出空指针异常

java - Sonar lint 报告空可能点异常

java - 如何在ant上显示system.out(在控制台中)?

Java Jar Ant 包含文件夹

java - 无法从 openjfx 源代码和设置构建 SceneBuild

java - Surefire JUnit 测试不会在测试 xml 文件中记录失败的假设

java - 如何在HTTP客户端apache上编写测试?

c# - Sonar "Invalid character encountered in file"未分析的一些文件

c# - 有没有什么插件可以代替宪兵规则插件

ant - 从Gradle构建文件调用Ant jar目标