2013-05-17 10 views
10

Sto usando Ant, Jacoco e Sonar. Quando eseguo il mio build Sonar mi dice che "Nessuna informazione sulla copertura per test". e la dashboard di Sonar ha i risultati della mia copertura, ma non riesco a scavare in essi per vedere il codice. Tuttavia, il report HTML generato da Jacoco include drill down nel codice. Questo è il mio compito di copertura:
"Nessuna informazione sulla copertura per test." da Sonar con Jacoco Ant build

<jacoco:coverage destfile="${coverage.output.file}" > 
     <junit printsummary="on" 
      errorProperty="test.failed" 
      failureProperty="test.failed" 
      haltonfailure="yes" 
      fork="true"> 
      <formatter type="brief" usefile="false" /> 
      <formatter type="xml" /> 
      <classpath> 
       <path refid="test.build.class.path"/> 
       <pathelement location="${test.bin.dir}"/>  
      </classpath> 
      <batchtest todir="${results.dir}"> 
       <fileset dir="${test.bin.dir}"> 
        <include name = "**/**/*Test.class"/> 
       </fileset> 
      </batchtest> 
     </junit> 
    </jacoco:coverage> 

    <jacoco:report> 
     <executiondata> 
      <file file="${coverage.output.file}"/> 
     </executiondata> 
     <structure name="${ant.project.name}"> 
      <classfiles> 
       <fileset dir="${bin.dir}"/> 
      </classfiles> 
      <sourcefiles encoding="UTF-8"> 
       <fileset dir="${src.dir}"/> 
      </sourcefiles> 
     </structure> 
     <html destdir="${coverage.results.dir}"/> 
    </jacoco:report> 
</target> 

E il mio obiettivo Sonar è simile al seguente:

<target name="sonar" depends = "run"> 
    <property name="sonar.jdbc.url" value="..." /> 
    <property name="sonar.jdbc.username" value="...r" /> 
    <property name="sonar.jdbc.password" value="..." /> 

    <property name="sonar.projectKey" value="org.codehaus.sonar:example-java-ant" /> 
    <property name="sonar.projectName" value="${ant.project.name} (ant)" /> 
    <property name="sonar.projectVersion" value="1.0" /> 
    <property name="sonar.language" value="java" /> 
    <property name="sonar.sources" value="${src.dir}" /> 
    <property name="sonar.binaries" value="${bin.dir},${test.bin.dir}" /> 
    <property name="sonar.libraries" value="${lib.dir}/*.jar" />  

    <property name="sonar.dynamicAnalysis" value="reuseReports" /> 
    <property name="sonar.surefire.reportsPath" value="${results.dir}" /> 
    <property name="sonar.java.coveragePlugin" value="jacoco" /> 
    <property name="sonar.jacoco.reportPath" value="${coverage.output.file}" /> 

    <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml"> 
     <classpath>   
      <fileset dir="${lib.dir}" includes="sonar-ant-task-2.0.jar"/> 
     </classpath> 
    </taskdef> 

    <sonar:sonar />  
</target> 

Qualcuno sa che cosa mi manca?

risposta

2

Sembra che tu non abbia impostato la proprietà "sonar.tests" per comunicare a Sonar dove trovare il codice sorgente dei test dell'unità. Vedi http://docs.sonarqube.org/display/SONAR/Analysis+Parameters.

David RACODON | SonarSource

+2

Confermo - nel mio caso, questo è stato impostato per testare le fonti, mentre dovrebbe puntare alle classi compilate. –

+5

Ho provato ad aggiungere la proprietà sonar.tests per fare riferimento sia al codice sorgente che al codice byte. Nessuno dei due ha funzionato. Sono ancora convinto di questo. –

+0

Ho lo stesso problema. Penso che questo potrebbe essere un bug con l'attività Ant poiché l'ho fatto usando Sonar Runner e ha funzionato bene, ma le stesse proprietà in Ant falliscono. – rozner

2

La proprietà sonar.test deve essere impostata sulle classi di test. Abbiamo il seguente nel nostro maven pom. Per ANT si fa qualcosa di simile:

<profile> 
     <id>sonarprofile</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <properties> 
      <sonar.host.url>....our host..../sonar.host.url> 
      <sonar.projectKey>....our key....</sonar.projectKey> 
      <sonar.projectName>${project.artifactId}</sonar.projectName> 
      <sonar.projectVersion>${project.version}</sonar.projectVersion> 
      <sonar.language>java</sonar.language> 
      <sonar.sources>src/main/java</sonar.sources> 
      <!-- sonar.tests>target/test-classes</sonar.tests --> 
      <!-- that is the default location for Maven projects and --> 
      <!-- this parameter can't actually be set in that case --> 
      <sonar.scm.provider>git</sonar.scm.provider> 
      <sonar.login>${SONAR_LOGIN}</sonar.login> 
      <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> 
      <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin> 
      <sonar.jacoco.reportPath>${basedir}/target/coverage-reports/jacoco-unit.exec</sonar.jacoco.reportPath> 
     </properties> 
    </profile> 

Incidentalmente ci sono alcune altre proprietà di essere utilizzati in questo:

  • ho generato un token SONAR attraverso il mio utente sonar, piuttosto che l'uso di login e password
  • La copertura JaCoCo viene generata separatamente utilizzando jacoco-maven-plugin e sonar.jacoco.reportPath è una proprietà utilizzata in tale plug-in. La risposta di

David Racodon (https://stackoverflow.com/a/16645108/1019307) era una volta corretti ma a metà del 2014 SonarQube interrotto l'esecuzione del test come parte dell'esecuzione del sonar (http://www.sonarqube.org/unit-test-execution-in-sonarqube/). Quindi perché puntare alla fonte di test non funziona più.

+0

È 'sonar.tests', non' sonar.test' Inoltre: "Non compatibile con Maven, che recupera il test dal percorso predefinito per i progetti Java Maven." Vedi http://docs.sonarqube.org/display/SONAR/Analysis+Parameters –

+0

Ok, questo è un parametro sbagliato (anche se ha funzionato per me). Anche se non è in realtà sbagliato ma ridondante. È una ragione per il downvote? Un semplice commento mi avrebbe fatto aggiornare la mia risposta. – HankCa

+1

Ciao @HankCa, ora che hai aggiornato la tua risposta ho rimosso il downvote. Non prendere sul serio i singoli voti :-) –

Problemi correlati