5

次の 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 テスト成功を報告します。

各テスト方法とその統計にドリルダウンできるようにするにはどうすればよいですか?

4

2 に答える 2

6

この問題に遭遇した他の人のために、私はついにソナーに私たちのエマコードカバレッジについて報告してもらいました。最初の問題は、Emmaプラグインに私が使用していたバージョンのSonar(3.1.1)が付属していないことでした。ダウンロードしてSonarextensions/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拡張子が付いており、他の機能が損なわれるため、名前を変更できませんでした。そこで、Sonar Emmaプラグインが期待する命名基準に一致するようにファイルをコピーするために、次のAntタスクを作成しました。

<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プラグインのページに記載されているように、Sonar Emma1.0.1プラグインがEmma2.0.5312に対してコンパイルされ、SonarEmma1.1および1.2.xがEmmaバージョン2.1.5320に対してコンパイルされていることがわかりました。

2.1.5320バージョンのEmmaをダウンロードし、Antlibディレクトリのemma.jarとemma_ant.jarの両方を置き換えまし。クリーンな再コンパイルとテストの後、Sonar Antタスクを再実行し、コードカバレッジをSonarに反映させることができました。

于 2012-06-28T18:29:19.890 に答える
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>
于 2011-08-28T17:54:17.597 に答える