FAQ
Fragen aus dem Kopf seitdem bin ich verrückt nach Jacoco geworden.
Mein Anwendungsserver (jBoss, Glassfish ..) befindet sich im Irak, Syrien, was auch immer. Ist es möglich, eine Abdeckung mit mehreren Modulen zu erhalten, wenn Integrationstests darauf ausgeführt werden? Jenkins und Sonar befinden sich ebenfalls auf verschiedenen Servern.
Ja. Sie müssen jacoco agent verwenden , der im Modus output=tcpserver
jacoco ant lib ausgeführt wird. Grundsätzlich zwei jar
s. Dies gibt Ihnen 99% Erfolg.
Wie funktioniert Jacoco Agent?
Sie fügen eine Zeichenfolge hinzu
-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*
auf Ihren Anwendungsserver JAVA_OPTS und starten Sie ihn neu. In dieser Zeichenfolge muss nur [your_path]
der Pfad zu jacocoagent.jar ersetzt werden, der auf Ihrer VM gespeichert (gespeichert!) Ist, auf der der App-Server ausgeführt wird. Seit dem Start des App-Servers werden alle bereitgestellten Anwendungen dynamisch überwacht und ihre Aktivität (dh die Verwendung von Code) kann von Ihnen per tcl-Anforderung im jacocos .exec-Format abgerufen werden.
Könnte ich den jacoco-Agenten zurücksetzen, um erst seit Beginn meines Tests mit der Erfassung von Ausführungsdaten zu beginnen?
Ja, zu diesem Zweck benötigen Sie das Build-Skript jacocoant.jar und ant in Ihrem Jenkins-Arbeitsbereich.
Was ich also von http://www.eclemma.org/jacoco/ benötige, ist jacocoant.jar in meinem Jenkins-Arbeitsbereich und jacocoagent.jar auf meiner App-Server-VM?
Das stimmt.
Ich möchte keine Ameise verwenden, ich habe gehört, dass das Jacoco Maven Plugin all diese Dinge auch kann.
Das ist nicht richtig, das jacoco maven Plugin kann Unit-Testdaten und einige Integrationstestdaten sammeln (siehe Arquillian Jacoco ), aber wenn Sie zum Beispiel Tests als separate Build-in-Jenkins versichern und die Abdeckung mehrerer Module zeigen möchten, kann ich das Ich sehe nicht, wie das Maven-Plugin Ihnen helfen kann.
Was genau produziert Jacoco Agent?
Nur Abdeckungsdaten im .exec
Format. Sonar kann es dann lesen.
Muss Jacoco wissen, wo sich meine Java-Klassen befinden?
Nein, Sonar, aber kein Jacoco. Wenn Sie den mvn sonar:sonar
Weg zum Unterricht gehen, kommt er ins Spiel.
Was ist also mit dem Ameisenskript?
Es muss in Ihrem Jenkins-Arbeitsbereich präsentiert werden. Mein Ameisenskript, ich habe es jacoco.xml
so genannt:
<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>
Zwei obligatorische Parameter, die Sie beim Aufrufen dieses Skripts übergeben sollten,
-Dworkspace=$WORKSPACE
verwenden es, um auf Ihren Jenkins-Arbeitsbereich zu verweisen und -Djacoco.host=yourappserver.com
ohne zu hostenhttp://
jacocoant.jar
Beachten Sie auch, dass ich meine in $ {workspace} /tools/jacoco/jacocoant.jar platziere
Was soll ich als nächstes tun?
Haben Sie Ihren App-Server mit jacocoagent.jar gestartet?
Haben Sie Ant Script und jacocoant.jar in Ihren Jenkins-Arbeitsbereich eingefügt?
Wenn ja, besteht der letzte Schritt darin, einen Jenkins-Build zu konfigurieren. Hier ist die Strategie:
- Rufen Sie ant target
jacocoReset
auf, um alle zuvor gesammelten Daten zurückzusetzen.
- Führen Sie Ihre Tests aus
- Rufen Sie das Ameisenziel auf
jacocoReport
, um einen Bericht zu erhalten
Wenn alles in Ordnung ist, sehen Sie it-jacoco.exec
in Ihrem Build-Arbeitsbereich.
Schauen Sie sich den Screenshot an, den ich auch ant
in meinem Arbeitsbereich in $WORKSPACE/tools/ant
dir installiert habe , aber Sie können einen verwenden, der in Ihren Jenkins installiert ist.
Wie kann man diesen Bericht im Sonar pushen?
Maven sonar:sonar
erledigt den Job (vergessen Sie nicht, ihn zu konfigurieren) und zeigt auf die Hauptdatei pom.xml, damit er alle Module durchläuft. Verwenden Sie den sonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec
Parameter, um dem Sonar mitzuteilen, wo sich Ihr Integrationstestbericht befindet. Jedes Mal, wenn neue Modulklassen analysiert werden, wird nach Informationen zur Abdeckung in gesucht it-jacoco.exec
.
Ich habe bereits jacoco.exec in meinem `target`-Verzeichnis,` mvn sonar: sonar` ignoriert / entfernt es
Standardmäßig mvn sonar:sonar
wird clean
Ihr Zielverzeichnis gelöscht, um dies sonar.dynamicAnalysis=reuseReports
zu vermeiden.