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