2011-08-27 17 views
5

Ho il seguente obiettivo Sonar Ant definito:Come far sì che Sonar esporti le statistiche dei test?

<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> 

Quando eseguo 'sonar formica' e portare fino Sonar nel mio browser, vedo informazioni sulle classi nella directory src, ma nulla circa la roba in la directory di test.

Se aggiungo $ {test.src.dir} a sonar.sources e non imposto sonar.tests, vedo alcune informazioni sulle classi di test, ma Sonar segnala ancora 0 test eseguiti.

Come ottengo in modo che sia possibile eseguire il drill-down su ciascun metodo di prova e le relative statistiche?

risposta

2

La proprietà 'sonar.surefire.reportsPath' deve essere definita prima della definizione del target sonar.

la seguente definizione ottiene informazioni di test esportato (anche se ancora non l'esportazione di informazioni di copertura):

<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> 
+0

Ciao Sto avendo un [problema simile] (http://stackoverflow.com/questions/21267948/sonarqube-test-coverage-report-for-android-built-with-ant) ma non proprio la stessa cosa. .. come state ottenendo un file .emma? – JaKXz

+0

Abbiamo effettivamente smesso di usare Sonar e costruiremo il nostro repository di dati di build. –

6

Per chiunque altro che attraversa questo problema, finalmente ho Sonar di riferire in merito nostra copertura Codice Emma. Il primo problema era che il plugin Emma non veniva fornito con la versione di Sonar che stavo usando (3.1.1). Ho dovuto download it e installarlo nella directory extensions/plugins di Sonar e riavviarlo.

Poi ho dovuto impostare le seguenti proprietà nel mio build.xml:

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

Dopo questo, io atleast visto la seguente output dopo l'esecuzione del compito formica Sonar:

[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 

Dopo un po ' scavando, ho trovato che all'interno del Sonar Emma plugin, è hardcoded per cercare un file .ec (copertura) e un file .em (metadati). Sfortunatamente, il mio file di copertura aveva un'estensione .emma come il mio file di metadati e non ero in grado di rinominarli perché avrebbe infranto altre funzionalità. Così ho scritto la seguente attività Ant per copiare i file in modo che corrispondessero allo standard di denominazione previsto dal plug-in 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> 

Dopo l'esecuzione di questo nuovo, mi sono imbattuto in un problema nuovo:

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] 

Dopo un po 'di più di scavo, ho scoperto che il Sonar Emma 1.0.1 plugin è stato compilato con Emma 2.0.5312 e il Sonar Emma 1.1 e 1.2.x contro Emma versione 2.1.5320 come indicato nella pagina Sonar Emma plugin.

Ho scaricato la versione 2.1.5320 di Emma, ​​sostituito sia emma.jar nonché emma_ant.jar nella mia directory lib Ant. Dopo una nuova ricompilazione e un test, sono riuscito a rieseguire l'attività Sonar Ant e la mia copertura del codice si rifletteva su Sonar.