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 dwie jar
sekundy. To da ci 99% sukcesu.
Jak działa agent jacoco?
Dołączasz ciąg
-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*
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:
<project name="Jacoco library to collect code coverage remotely" xmlns:jacoco="antlib:org.jacoco.ant">
<property name="jacoco.port" value="6300"/>
<property name="jacocoReportFile" location="${workspace}/it-jacoco.exec"/>
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${workspace}/tools/jacoco/jacocoant.jar"/>
</taskdef>
<target name="jacocoReport">
<jacoco:dump address="${jacoco.host}" port="${jacoco.port}" dump="true" reset="true" destfile="${jacocoReportFile}" append="false"/>
</target>
<target name="jacocoReset">
<jacoco:dump address="${jacoco.host}" port="${jacoco.port}" reset="true" destfile="${jacocoReportFile}" append="false"/>
<delete file="${jacocoReportFile}"/>
</target>
</project>
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.jar
Co 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:
- Wywołaj cel mrówki,
jacocoReset
aby zresetować wszystkie zebrane wcześniej dane.
- Przeprowadź testy
- Wywołaj cel mrówki,
jacocoReport
aby uzyskać raport
Jeś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żyj sonar.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 w it-jacoco.exec
.
Mam już jacoco.exec w moim katalogu docelowym, sonar mvn: sonar go ignoruje / usuwa
Domyślnie mvn sonar:sonar
robi clean
i usuwa katalog docelowy, użyj, sonar.dynamicAnalysis=reuseReports
aby tego uniknąć.