2011-10-12 17 views
9

Sto usando il sonar per misurare la qualità del codice. Una cosa che non conosco è la procedura per misurare la copertura del codice utilizzando Cobertura.SONAR - Misura la copertura del codice usando Cobertura

Ho seguito i passaggi da http://cobertura.sourceforge.net/anttaskreference.html ed è stato in grado di generare file xml. Come posso ottenere questi file xml in SONAR?

C'è un modo più semplice per usare Cobertura in SONAR?

Sto eseguendo la copertura del codice (Cobertura) su un server diverso dal mio server SONAR. Entrambi i server funzionano sotto LINUX.

Grazie per l'aiuto!

+0

Aggiornamento su questo argomento: esempi possono essere trovati sul nostro repository esempio-sonar => https://github.com/SonarSource/sonar-examples/tree/master/projects/code-coverage –

risposta

11

si configura il compito Sonar per caricare rapporti di prova dell'unità e COBERTURA generati da altre parti della vostra logica build.

Ciò è in contrasto con Maven che ha un ciclo di vita di build standard che Sonar è in grado di sfruttare.

Unità di prova e la copertura del codice

La seguente logica esegue i test di unità con cobertura strumentati classi.Un rapporto di copertura XML è generato dal cobertura alla fine:

<target name="instrument-classes" depends="compile-tests"> 
    <taskdef resource="tasks.properties" classpathref="test.path"/> 
    <cobertura-instrument todir="${instrumented.classes.dir}" datafile="${build.dir}/cobertura.ser"> 
     <fileset dir="${classes.dir}"/> 
    </cobertura-instrument> 
</target> 

<target name="junit" depends="instrument-classes"> 
    <junit printsummary="yes" haltonfailure="yes"> 
     <classpath> 
      <path refid="test.path"/> 
      <pathelement path="${instrumented.classes.dir}"/> 
      <pathelement path="${test.classes.dir}"/> 
     </classpath> 

     <formatter type="xml"/> 

     <batchtest fork="yes" todir="${test.reports.dir}"> 
      <fileset dir="${test.src.dir}"> 
       <include name="**/*Test*.java"/> 
       <exclude name="**/AllTests.java"/> 
      </fileset> 
     </batchtest> 
    </junit> 
</target> 

<target name="test" depends="junit"> 
    <cobertura-report format="xml" datafile="${build.dir}/cobertura.ser" destdir="${cobertura.reports.dir}"/> 
</target> 

Invocare Sonar

Io di solito uso un semplice obiettivo di Sonar:

<target name="sonar" depends="test"> 
    <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml" classpathref="sonar.path"/> 

    <sonar:sonar key="${sonar.project.key}" version="${sonar.project.version}" xmlns:sonar="antlib:org.sonar.ant"/> 
</target> 

e utilizzare un file di proprietà per controllare tutti gli aspetti del comportamento di Sonar:

sonar.project.key=org.demo:demo 
sonar.project.version=1.0-SNAPSHOT 
sonar.projectName=Demo project 

sonar.host.url=http://myserver:9000 
sonar.jdbc.url=jdbc:mysql://myserver:3306/sonar?useUnicode=true&characterEncoding=utf8 
sonar.jdbc.driverClassName=com.mysql.jdbc.Driver 
sonar.jdbc.username=sonar 
sonar.jdbc.password=sonar 

sonar.sources=${src.dir} 
sonar.tests=${test.src.dir} 
sonar.binaries=${classes.dir} 

sonar.dynamicAnalysis=reuseReports 
sonar.surefire.reportsPath=${test.reports.dir} 
sonar.java.coveragePlugin=cobertura 
sonar.cobertura.reportsPath=${cobertura.reports.dir}/coverage.xml 

dimostra come Sonar può essere configurato per raccogliere i rapporti sui test unitari creati da junit e il rapporto sulla copertura del codice generato da cobertura.

La build non deve essere eseguita sullo stesso server di Sonar. In tal caso è necessario fornire l'URL del Sonar remoto e le credenziali JDBC.

+0

Ho provato a seguire le tue istruzioni; tuttavia, ho ancora lo stesso problema di prima, non riesco a vedere la statistica di copertura all'interno di SONAR. I file xml e ser generati sono simili a quelli che avevo precedentemente. Puoi aiutarmi a far funzionare la statistica in SONAR? – lwijono

+0

L'output dell'attività Sonar mostra che stai caricando il file di copertura corretto? –

+0

Come posso verificarlo? – lwijono

2

Si dovrebbe aggiungere queste proprietà per pom.xml del Sonar:

<properties> 
    <sonar.dynamicAnalysis>false</sonar.dynamicAnalysis> 
    <sonar.phase>generate-sources</sonar.phase> 
    <sonar.surefire.reportsPath>target/reports/test/</sonar.surefire.reportsPath> 
    <sonar.cobertura.reportPath>../project/target/reports/coverage/coverage.xml</sonar.cobertura.reportPath> 
</properties> 

(con percorsi appropriati per il proprio ambiente)

ed eseguire:

mvn sonar:sonar 

Controllare la user list per maggiori dettagli .

+0

E se il mio progetto non usare Maven? Devo ancora eseguirlo? Dal sito Web di Cobertura, sembra che possiamo anche usare ANT. Ho sbagliato? In questo momento, sono confuso con la relazione tra sonar - maven - Cobertura. Diciamo che invoco una build da hudson chiamando ant che eseguirà il mio script di build. Il mio script di build eseguirà una build e aggiornerà anche il DB SONAR. Inoltre, originariamente, pensavo di dover aggiungere alcuni comandi nel mio script di build che eseguirà Coberture. Ora non sono sicuro. Come dovrei invocare Coberture con Maven nel mio caso? Un'altra soluzione è anche benvenuta? Grazie per il tuo aiuto. – lwijono

+0

Sonar è stato accoppiato a Maven fino a poco tempo fa. Dal 2.6 (marzo 2011), 'Sonar' supporta anche ANT. Puoi aggiungere le proprietà sopra allo script ant come mostrato [qui] (http://docs.codehaus.org/display/SONAR/Analyse+with+Ant+Task+1.0), ad esempio: ''. Non ho eseguito Sonar + Cobertura + Ant runner, ma non dovrebbe essere diverso. In alternativa, puoi controllare un Sonar Stand Alone (senza ANT, Maven, ecc.) [Runner] (http://docs.codehaus.org/display/SONAR/Analyse+with+a+simple+Java+Runner) – tolitius

1

se si utilizza Maven, quindi non si dispone di nulla di speciale da specificare nel file POM. Basta eseguire "mvn clean sonar: sonar" e Sonar compilerà automaticamente il codice, eseguirà i test con Cobertura (che è il motore di copertura predefinito in Sonar) e sposterà tutti i risultati nel DB.

Lo stesso se si utilizza Ant [1] o il semplice java runner [2] invece di Maven.

Insisto sul fatto che non è necessario eseguire manualmente Cobertura (con un'attività Ant, ad esempio) per eseguire Sonar.

[1] http://docs.codehaus.org/display/SONAR/Analyzing+with+Sonar+Ant+Task

[2] http://docs.codehaus.org/display/SONAR/Analyse+with+a+simple+Java+Runner

Fabrice, SonarSource

Problemi correlati