我定义了以下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。呼叫声纳。信号源和未设置声纳。我看到了一些关于测试类的信息,但是Sonar仍然报告0个测试成功。
我如何得到它,以便我可以深入到每个测试方法和它们的状态?
对于其他遇到这个问题的人,我终于让Sonar报告了我们对Emma Code的报道。第一个问题是Emma插件没有附带我使用的Sonar版本(3.1.1)。我必须下载并安装到Sonar的extensions/plugins
目录下,然后重新启动它。
然后我必须在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插件内部,它是硬编码的,以查找。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编译的。
声纳艾玛插件页面上所述的艾玛版本2.1.5320。我下载了Emma的2.1.5320版本,替换了我的Ant lib目录中的Emma .jar和emma_ant.jar。经过干净的重新编译和测试后,我能够重新运行Sonar Ant任务,并在Sonar上反映我的代码覆盖率。
属性" 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>