Byłem w takiej samej sytuacji jak Ty, pół odpowiedzi rozproszone po całym Internecie były dość irytujące, ponieważ wydawało się, że wiele osób ma ten sam problem, ale nikt nie mógł się martwić, aby w pełni wyjaśnić, jak go rozwiązali.
Dokumentacja Sonar odnosi się do projektu GitHub z przykładami, które są pomocne. Aby rozwiązać ten problem, zastosowałem logikę testów integracyjnych do zwykłych testów jednostkowych (chociaż prawidłowe testy jednostkowe powinny być specyficzne dla podmodułu, nie zawsze tak jest).
W nadrzędnym pom.xml dodaj następujące właściwości:
<properties>
<!-- Sonar -->
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.language>java</sonar.language>
</properties>
Spowoduje to, że Sonar pobierze raporty z testów jednostkowych dla wszystkich modułów podrzędnych w tym samym miejscu (folder docelowy w projekcie nadrzędnym). Nakazuje również Sonarowi ponowne wykorzystanie raportów wykonanych ręcznie zamiast tworzenia własnych. Musimy tylko sprawić, by jacoco-maven-plugin działał dla wszystkich podmodułów, umieszczając to w macierzystym pom, wewnątrz kompilacji / wtyczek:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.0.201210061924</version>
<configuration>
<destFile>${sonar.jacoco.reportPath}</destFile>
<append>true</append>
</configuration>
<executions>
<execution>
<id>agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
destFile
umieszcza plik raportu w miejscu, w którym Sonar będzie go szukał i append
sprawia, że jest on dołączany do pliku zamiast go nadpisywać. Spowoduje to połączenie wszystkich raportów JaCoCo dla wszystkich podmodułów w tym samym pliku.
Sonar sprawdzi ten plik dla każdego modułu podrzędnego, ponieważ wskazaliśmy mu na to powyżej, dając nam połączone wyniki testów jednostkowych dla plików wielomodułowych w Sonar.
mvn package
przed uruchomieniem,mvn sonar:sonar
aby wygenerować nową ścieżkę raportu.FAQ
Pytania z góry głowy od tego czasu oszalałem na punkcie jacoco.
Mój serwer aplikacji (jBoss, Glassfish ..) znajduje się w Iraku, Syrii, cokolwiek ... Czy jest możliwe uzyskanie pokrycia wielomodułowego podczas przeprowadzania na nim testów integracyjnych? Jenkins i Sonar również znajdują się na różnych serwerach.
Tak. Musisz użyć agenta jacoco, który działa w trybie
output=tcpserver
, jacoco ant lib. Zasadniczo dwiejar
sekundy. To da ci 99% sukcesu.Jak działa agent jacoco?
Dołączasz ciąg
do serwera aplikacji JAVA_OPTS i zrestartuj go. W tym ciągu wystarczy tylko
[your_path]
zastąpić ścieżkę do jacocoagent.jar, przechowywaną (przechowuj ją!) Na maszynie wirtualnej, na której działa serwer aplikacji. Od tego czasu uruchomisz serwer aplikacji, wszystkie wdrożone aplikacje będą dynamicznie monitorowane, a ich aktywność (czyli użycie kodu) będzie gotowa do uzyskania w formacie jacocos .exec na żądanie tcl.Czy mogę zresetować agenta jacoco, aby zaczął zbierać dane wykonania dopiero od czasu rozpoczęcia mojego testu?
Tak, w tym celu potrzebujesz jacocoant.jar i skryptu budującego mrówka znajdującego się w obszarze roboczym jenkins.
Więc zasadniczo to, czego potrzebuję z http://www.eclemma.org/jacoco/, to jacocoant.jar znajdujący się w moim obszarze roboczym jenkins i jacocoagent.jar znajdujący się na mojej maszynie wirtualnej serwera aplikacji?
Zgadza się.
Nie chcę używać mrówka, słyszałem, że wtyczka jacoco maven też potrafi wszystko.
To nie w porządku, wtyczka jacoco maven może zbierać dane z testów jednostkowych i niektóre dane z testów integracji (patrz Arquillian Jacoco ), ale jeśli masz na przykład spokojne testy jako oddzielną kompilację w jenkins i chcesz pokazać pokrycie wielu modułów, mogę Nie widzę, jak wtyczka Maven może ci pomóc.
Co dokładnie wytwarza agent jacoco?
Tylko dane pokrycia w
.exec
formacie. Sonar może to odczytać.Czy jacoco musi wiedzieć, gdzie znajdują się moje klasy Java?
Nie, sonar tak, ale nie jacoco. Kiedy idziesz
mvn sonar:sonar
na zajęcia, w grę wchodzi.A co ze skryptem mrówek?
Musi być prezentowany w Twoim obszarze roboczym Jenkinsa. Mój skrypt mrówki, nazwałem go
jacoco.xml
tak:Dwa obowiązkowe parametry, które należy przekazać podczas wywoływania tego skryptu,
-Dworkspace=$WORKSPACE
używają go do wskazania obszaru roboczego Jenkinsa i-Djacoco.host=yourappserver.com
hosta bezhttp://
Zauważ też, że umieściłem mój
jacocoant.jar
w $ {workspace} /tools/jacoco/jacocoant.jarCo mam teraz zrobić?
Czy serwer aplikacji został uruchomiony z plikiem jacocoagent.jar?
Czy umieściłeś ant script i jacocoant.jar w swoim obszarze roboczym Jenkins?
Jeśli tak, ostatnim krokiem jest skonfigurowanie kompilacji Jenkinsa. Oto strategia:
jacocoReset
aby zresetować wszystkie zebrane wcześniej dane.jacocoReport
aby uzyskać raportJeśli wszystko jest w porządku, zobaczysz
it-jacoco.exec
w obszarze roboczym kompilacji.Spójrz na zrzut ekranu, mam również
ant
zainstalowany w moim obszarze roboczym w$WORKSPACE/tools/ant
dir, ale możesz użyć takiego, który jest zainstalowany w twoich jenkinsach.Jak przesłać ten raport do sonaru?
Maven
sonar:sonar
wykona zadanie (nie zapomnij go skonfigurować), wskaże mu główny pom.xml, aby przeszedł przez wszystkie moduły. Użyjsonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec
parametru, aby wskazać sonarowi, gdzie znajduje się raport z testu integracji. Za każdym razem, gdy przeanalizuje nowe klasy modułów, będzie szukał informacji o pokryciu wit-jacoco.exec
.Mam już jacoco.exec w moim katalogu docelowym, sonar mvn: sonar go ignoruje / usuwa
Domyślnie
mvn sonar:sonar
robiclean
i usuwa katalog docelowy, użyj,sonar.dynamicAnalysis=reuseReports
aby tego uniknąć.źródło
NOWA SPOSÓB OD WERSJI 0.7.7
Od wersji 0.7.7 istnieje nowy sposób tworzenia raportu zbiorczego:
Tworzysz osobny projekt „raportu”, który zbiera wszystkie niezbędne raporty (każdy cel w projekcie agregatora jest wykonywany przed jego modułami, dlatego nie można go użyć).
W korzeń pom wygląda następująco (nie zapomnij dodać nowy moduł raportu pod moduły):
Poms z każdego modułu podrzędnego w ogóle nie musi być zmieniany. Pom z modułu raportu wygląda następująco:
Pełen przykład można znaleźć tutaj .
źródło
Opublikuję moje rozwiązanie, ponieważ różni się ono nieznacznie od innych, a także zajęło mi cały dzień, aby uzyskać dobre wyniki, z pomocą istniejących odpowiedzi.
W przypadku wielomodułowego projektu Maven:
Tam, gdzie
WAR
projekt jest główną aplikacją internetową,LIB
1 i 2 to dodatkowe moduły, od którychWAR
zależą i odTEST
których odbywają się testy integracji.TEST
uruchamia osadzoną instancję Tomcat (nie przez wtyczkę Tomcat) i uruchamiaWAR
projekt i testuje je za pomocą zestawu testów JUnit.WAR
ILIB
projekty zarówno mają własne testy jednostkowe.Rezultatem tego wszystkiego jest oddzielenie pokrycia integracji i testów jednostkowych i możliwość ich rozróżnienia w SonarQube.
ROOT pom.xml
WAR
,LIB
iTEST
pom.xml
odziedziczy wykonanie wtyczki JaCoCo.TEST pom.xml
Zauważyłem również, że wpis na blogu Petri Kainulainens „Tworzenie raportów pokrycia kodu dla testów jednostkowych i testów integracji z wtyczką JaCoCo Maven” jest wartościowy dla strony konfiguracji JaCoCo.
źródło
agent-for-it
jest niezbędny tylko podczas uruchamiania testów wTEST
module, ale w obecnej konfiguracji jest on uruchamiany dla każdego innego modułu, gdzie nie ma wartości. Poprawa polegałaby naagent-for-ut
uruchomieniu wszystkich innych modułów iagent-for-it
tylko uruchomieniuTEST
.Jest na to sposób. Magia polega na stworzeniu połączonego pliku jacoco.exec. Dzięki maven 3.3.1 można to łatwo osiągnąć. Tutaj mój profil:
Jeśli dodasz ten profil do swojego rodzica i zadzwonisz
mvn clean install sonar:sonar -DrunSonar
, otrzymasz pełne ubezpieczenie.Oto magia
maven.multiModuleProjectDirectory
. Ten folder jest zawsze folderem, w którym rozpocząłeś kompilację mavena.źródło
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar -DrunSonar
powoduA required class was missing while executing org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar: org/sonar/batch/bootstrapper/IssueListener
błędu.Konfiguracja, której używam w pom na poziomie rodzica, gdzie mam oddzielne fazy testów jednostkowych i integracyjnych.
Konfiguruję następujące właściwości w nadrzędnych właściwościach POM
Umieszczam definicje wtyczek w zarządzaniu wtyczkami.
Zauważ, że zdefiniowałem właściwość dla argumentów surefire (surefireArgLine) i failafe (failedafeArgLine), aby umożliwić jacoco skonfigurowanie javaagent do uruchamiania z każdym testem.
W ramach zarządzania wtyczkami
I w sekcji kompilacji
Oraz w sekcji raportowania
źródło
<append>true</append>
konfigurację wprepare-agent
sekcjach ...Znalazłem inne rozwiązanie dla nowych wersji Sonara, w którym format raportu binarnego JaCoCo (* .exec) został wycofany, a preferowanym formatem jest XML (SonarJava 5.12 i nowsze). Rozwiązanie jest bardzo proste i podobne do poprzedniego rozwiązania z raportami * .exec w katalogu nadrzędnym z tego tematu: https://stackoverflow.com/a/15535970/4448263 .
Zakładając, że nasza struktura projektu to:
Potrzebujesz następującej konfiguracji wtyczki maven build w zbiorczym pom projektu:
Następnie zbuduj projekt za pomocą maven:
W przypadku Sonara należy ustawić właściwość w administracyjnym interfejsie użytkownika:
lub używając linii poleceń:
Opis
To tworzy raporty binarne dla każdego modułu w domyślnych katalogach:
target/jacoco.exec
. Następnie tworzy raporty w formacie XML dla każdego modułu w domyślnych katalogach:target/site/jacoco/jacoco.xml
. Następnie tworzy raport zbiorczy dla każdego modułu w katalogu niestandardowym,${project.basedir}/../target/site/jacoco-aggregate/
który jest powiązany z katalogiem nadrzędnym dla każdego modułu. Dla modułu A i modułuB będzie to wspólna ścieżkamoduleC/target/site/jacoco-aggregate/
.Ponieważ moduł B zależy od modułu A, moduł B zostanie zbudowany jako ostatni, a jego raport zostanie wykorzystany jako zbiorczy raport pokrycia w Sonar dla obu modułów A i B.
Oprócz raportu zbiorczego potrzebujemy zwykłego raportu modułu, ponieważ raporty zbiorcze JaCoCo zawierają dane pokrycia tylko dla zależności.
Razem te dwa typy raportów zapewniają pełne dane pokrycia dla Sonar.
Jest jedno małe ograniczenie: powinieneś być w stanie napisać raport w katalogu nadrzędnym projektu (powinieneś mieć uprawnienia). Lub możesz ustawić właściwość
jacoco.skip=true
w pom.xml projektu głównego (moduleC) orazjacoco.skip=false
w modułach z klasami i testami (moduleA i moduleB).źródło
źródło
Jak sonary
sonar.jacoco.reportPath
,sonar.jacoco.itReportPath
asonar.jacoco.reportPaths
wszystkie zostały przestarzałe , należy użyćsonar.coverage.jacoco.xmlReportPaths
teraz. Ma to również wpływ, jeśli chcesz skonfigurować projekt wielomodułowy Maven z Sonar i Jacoco.Jak zauważył @Lonzak , od Sonar 0.7.7 możesz używać celu agregacji raportu Sonary. Po prostu umieść w swoim rodzicu pom następującą zależność:
Ponieważ obecne wersje wtyczki jacoco-maven są kompatybilne z raportami xml, utworzy to dla każdego modułu w jego własnym folderze docelowym folder site / jacoco-zagregowany zawierający
jacoco.xml
plik.Aby Sonar połączył wszystkie moduły, użyj następującego polecenia:
Aby moja odpowiedź była krótka i precyzyjna, nie wspomniałem o zależnościach
maven-surefire-plugin
imaven-failsafe-plugin
. Możesz je po prostu dodać bez żadnej innej konfiguracji:źródło
Możesz wywołać zadanie mrówki o nazwie scalanie on maven, aby umieścić wszystkie pliki pokrycia (* .exec) razem w tym samym pliku.
Jeśli uruchamiasz testy jednostkowe, użyj pakietu przygotowania fazy , jeśli uruchamiasz test integracji, użyj testu po integracji .
Ta strona zawiera przykład, jak wywołać zadanie jacoco ant w projekcie maven
Możesz użyć tego scalonego pliku na sonarze.
źródło
aby mieć testowanie jednostkowe ORAZ testowanie integracji, możesz użyć maven-surefire-plugin i maven-failafe-plugin z ograniczonymi włączeniami / wykluczeniami. Bawiłem się CDI, kontaktując się z sonarem / jacoco, więc skończyłem w tym projekcie:
https://github.com/FibreFoX/cdi-sessionscoped-login/
Może ci to trochę pomoże. w moim pom.xml używam niejawnego „-javaagent”, ustawiając opcję argLine w sekcji konfiguracyjnej określonych wtyczek testowych. Jawne używanie ANT w projektach MAVEN jest czymś, czego nie spróbuję, dla mnie to za dużo mieszania dwóch światów.
Mam tylko jednomodułowy projekt Mavena, ale może pomoże ci dostosować twój do pracy.
uwaga: może nie wszystkie wtyczki maven są zaktualizowane, może niektóre problemy zostały naprawione w późniejszych wersjach
źródło
Ta próbka działa dla mnie bardzo dobrze:
źródło