Как заставить сонар экспортировать тестовую статистику? - PullRequest
5 голосов
/ 27 августа 2011

У меня определена следующая цель 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.src.dir} в sonar.sources и не установлю sonar.tests, я вижу некоторую информацию о тестовых классах, но Sonar по-прежнему сообщает 0 Test Successes.

Как мне получить его, чтобы я мог перейти к каждому методу теста и его статистике?

Ответы [ 2 ]

6 голосов
/ 28 июня 2012

Для всех, кто сталкивался с этой проблемой, я, наконец, попросил Сонар доложить о нашем покрытии Код Эммы.Первая проблема заключалась в том, что плагин Emma не поставлялся с версией Sonar, которую я использовал (3.1.1).Мне пришлось загрузить его и установить в каталог 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 ,он жестко запрограммирован для поиска файла .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 page.

Я скачал версию Emma 2.1.5320, заменил emma.jar , а также emma_ant.jar в моем каталоге Ant lib.После чистой перекомпиляции и тестирования я смог повторно запустить задачу Sonar Ant, и мой охват кода был отражен в Sonar.

2 голосов
/ 28 августа 2011

Свойство '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>
...