2015-07-15 13 views
5

Sto provando a generare dati di copertura del codice di test unitario per sonar per un progetto multi-modulo maven e non ottenere risultati corretti.Impossibile eseguire il sonar per elaborare i file exec jacoco per un progetto multi-modulo maven

La struttura del progetto è simile al seguente:

  • progetto
    • parentPom
    • moduleA
    • moduleB
      • modulo B1
      • modulo B2
    • modulo C

Sto usando l'esperto jacoco plug per generare jacoco.exec file, e l'esperto di sonar plugin per analizzare il codice (inclusi i file jacoco.exec).

Questi file vengono generati durante la fase di process-tests, come segue:

<properties> 
    <jacoco.report.path>${project.build.directory}/jacoco.exec</jacoco.report.path> 
    <sonar.jacoco.reportPath>${jacoco.report.path}</sonar.jacoco.reportPath> 
</properties> 

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.4.201502262128</version> 
    <executions> 
    <execution> 
     <id>default-prepare-agent</id> 
     <phase>process-test-classes</phase> 
     <goals> 
     <goal>prepare-agent</goal> 
     </goals> 
     <configuration> 
     <destFile>${jacoco.report.path}</destFile> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Quando eseguo mvn installazione pulita vedo che c'è un file jacoco.exec creata per ogni modulo:

$ find . -name '*.exec' 
./moduleA/target/jacoco.exec 
./moduleB/moduleB1/target/jacoco.exec 
./moduleB/moduleB2/target/jacoco.exec 
./moduleC/target/jacoco.exec 

Quando corro mvn sonar: sonar Vedo che il sensore Jacoco funziona per tutti i moduli, ma sembra funzionare solo con il primo modulo. moduli successivi mostrano Coverage information was not collected:

[INFO] [17:13:58.333] Sensor JaCoCoSensor 
[INFO] [17:13:58.350] Analysing moduleA\target\jacoco.exec 
[INFO] [17:13:58.374] No information about coverage per test. 
[INFO] [17:13:58.374] Sensor JaCoCoSensor (done) | time=41ms 
... 
[INFO] [17:14:02.202] Sensor JaCoCoSensor 
[INFO] [17:14:02.261] Analysing moduleB\moduleB1\target\jacoco.exec 
[WARN] [17:14:02.334] Coverage information was not collected. Perhaps you forget to include debug information into compiled classes? 
[INFO] [17:14:02.334] Sensor JaCoCoSensor (done) | time=132ms 
... 

io non sono sicuro perché non c'è informazioni sulla copertura nella seconda e successive moduli, dal momento che maven-compiler-plugin include informazioni di debug per default, e per essere sicuri Ho anche eseguito mvn clean install -Dmaven.compiler.debug=true ma ho ottenuto gli stessi risultati .

Come conseguenza di ciò, quando ispeziono il progetto nel server sonar mostra la copertura del codice solo per il primo modulo: moduleA. Non sono presenti informazioni sulla copertura del codice per gli altri moduli.

A quanto pare la soluzione qui è quello di generare un solo file jacoco.exec, in modo che quando il jacoco-maven-plugin esegue aggiunge il risultato per ciascun modulo a quel file, in modo che il sonar può funzionare correttamente la sua magia.

Di conseguenza, ho modificato il mio file parentPom/pom.xml come segue:

<properties> 
    <!-- single jacoco.exec file relative to root directory of the project --> 
    <jacoco.report.path>${session.executionRootDirectory}/code-coverage/jacoco.exec</jacoco.report.path> 
    <sonar.jacoco.reportPath>${jacoco.report.path}</sonar.jacoco.reportPath> 
</properties> 

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.4.201502262128</version> 
    <executions> 
    <execution> 
     <id>default-prepare-agent</id> 
     <phase>process-test-classes</phase> 
     <goals> 
     <goal>prepare-agent</goal> 
     </goals> 
     <configuration> 
     <destFile>${jacoco.report.path}</destFile> 
     <append>true</append> <!-- now appending to single jacoco.exec file --> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Ciò significa che dopo i test di unità hanno eseguito, l'agente jacaco viene richiamato Ora, quando corro mvn clean install vedo solo uno jacoco.exec File:

$ find . -name '*.exec' 
./code-coverage/target/jacoco.exec 

Ma quando corro mvn sonar: sonar il JaCoCoSe nsor non sembra essere invocato e il progetto sul server sonar non ha alcuna copertura di codice.

Cosa sto facendo di sbagliato qui? Come posso ottenere il sonar per analizzare la copertura del codice per tutti i moduli nel mio progetto Maven?

Devo modificare lo maven-surefire-plugin in qualche modo?

Sto usando SonarQube 5.1, JDK 1.8, jacoco-maven-plugin sensore 0.7.4.201502262128

risposta

1

JaCoCo sarà solo la copertura del carico per le classi coperto nel vostro modulo.

Ciò significa che se per qualche motivo il jacoco.exec nel modulo B non contiene informazioni sulla copertura dei file .class di questo modulo, allora non caricherà alcuna copertura (anche se hai coperto classi in un altro modulo) .

Problemi correlati