2015-07-15 8 views
5

Próbuję wygenerować dane pokrycia testu jednostkowego sonaru dla wielomodułowego projektu maven i nie uzyskać poprawnych wyników.Nie można uzyskać sonaru do przetwarzania plików jacoco exec dla wielomodułowego projektu maven

Struktura projekt jest podobny do następującego:

  • projektu
    • parentPom
    • moduleA
    • moduleB
      • moduł B1
      • Moduł B2
    • moduł C

Używam Maven jacoco plugin do generowania jacoco.exec pliki, a sonar Maven plugin do analizy kodu (w tym jacoco.exec plików).

Pliki te są generowane w fazie process-tests, co następuje:

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

Kiedy biegnę mvn czystej instalacji widzę, że tam jest jacoco.exec plik stworzony dla każdego modułu:

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

Po uruchomieniu mvn sonar: sonar Widzę, że czujnik Jacoco działa dla wszystkich modułów, ale tylko wydaje się działać z pierwszym modułem. Kolejne moduły pokazać 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 
... 

Nie jestem pewien, dlaczego nie ma informacji pokrycia w drugim i kolejnych modułów, ponieważ maven-compiler-plugin zawiera informacje debugowania domyślnie i pewności Ja również prowadził mvn clean install -Dmaven.compiler.debug=true ale mam takie same wyniki .

W konsekwencji, gdy sprawdzam projekt na serwerze sonaru, pokazuje on zasięg kodu tylko dla pierwszego modułu: moduleA. Brak informacji o zasięgu kodu dla pozostałych modułów.

Najwyraźniej rozwiązaniem jest wygenerowanie tylko jednego pliku jacoco.exec, tak aby po wykonaniu jacoco-maven-plugin dołączał on wynik dla każdego modułu do tego pliku, aby sonar mógł poprawnie wykonywać swoją magię.

związku z tym, że zmodyfikowane mój plik parentPom/pom.xml następująco:

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

To oznacza, że ​​po testy jednostkowe został uruchomiony agent jacaco jest wywoływana Teraz gdy uruchamiam mvn czystej instalacji widzę tylko jedną jacoco.exec plik:

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

Ale kiedy biegnę mvn sonar: sonarJaCoCoSe nsor nie wydaje się być wywoływany, a projekt na serwerze sonaru w ogóle nie ma zasięgu.

Co ja tu robię źle? Jak uzyskać sonar do analizy zasięgu kodu dla wszystkich modułów w moim projekcie maven?

Czy muszę w jakiś sposób zmodyfikować maven-surefire-plugin?

Używam SonarQube JDK 5.1, 1.8, jacoco-maven-plugin czujnik 0.7.4.201502262128

Odpowiedz

1

JaCoCo będzie tylko pokrycie obciążenia dla klas objętych Państwo w module.

Oznacza to, że jeśli z jakiegoś powodu jacoco.exec w twoim module B nie zawiera informacji o pokryciu plików .class tego modułu, to nie załaduje żadnego pokrycia (nawet jeśli pokryłeś klasy w innym module) .

Powiązane problemy