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

Noe*_*Yap 5 ant junit emma sonarqube

我定义了以下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>
Run Code Online (Sandbox Code Playgroud)

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

如果我将$ {test.src.dir}添加到sonar.sources而不设置sonar.tests,我会看到有关测试类的一些信息,但Sonar仍会报告0测试成功.

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

小智 6

对于遇到这个问题的其他人,我终于让Sonar报告了我们的Emma Code报道.第一个问题是Emma插件没有附带我使用的Sonar版本(3.1.1).我不得不下载它并将其安装到extensions/pluginsSonar目录并重新启动它.

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

<property name="sonar.core.codeCoveragePlugin" value="emma" />
<property name="sonar.emma.reportPath" value="${coverage.dir}" />
Run Code Online (Sandbox Code Playgroud)

在此之后,我至少在运行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
Run Code Online (Sandbox Code Playgroud)

经过一番挖掘后,我发现在Sonar Emma插件内部,它是硬编码的,可以查找.ec(coverage)文件和.em(元数据)文件.不幸的是,我的coverage文件的扩展名为.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>
Run Code Online (Sandbox Code Playgroud)

再次运行后,我遇到了一个新问题:

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]
Run Code Online (Sandbox Code Playgroud)

经过一番挖掘后,我发现Sonar Emma 1.0.1插件是针对Emma 2.0.5312和Sonar Emma 1.1和1.2.x针对Emma版本2.1.5320进行编译的,如Sonar Emma插件页面所述.

我下载了2.1.5320版本的Emma,在我的Ant lib目录中替换了emma.jaremma_ant.jar.经过彻底的重新编译和测试后,我能够重新运行Sonar Ant任务并将我的代码覆盖率反映在Sonar上.


Noe*_*Yap 2

属性“sonar.surefire.reportsPath”需要在定义声纳目标之前定义。

以下定义获取导出的测试信息(尽管它仍然没有导出覆盖率信息):

<property name='sonar.surefire.reportsPath' value='${test.dir}'/>

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

<target name='sonar'>
    <property name='sonar.sources' value='${src.dir}'/>
    <property name='sonar.tests' value='${test.src.dir}'/>
    <property name='sonar.binaries' value='${build.dir}'/>
    <path id='jars'>
        <fileset dir='${env.JAVA_HOME}/jre/lib' includes='*.jar'/>
        <fileset dir='${ivy.lib.dir}/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'/>
</target>
Run Code Online (Sandbox Code Playgroud)