Java >> Java Tutorial >  >> Tag >> maven

Erstellen von Code Coverage Reports für Unit- und Integrationstests mit dem JaCoCo Maven Plugin

Als ich anfing, Java 7 zu verwenden, bemerkte ich sofort, dass das Cobertura Maven-Plugin es nicht unterstützt. Das war ein großes Problem für mich, weil ich jeden Tag Codeabdeckungsberichte verwendete.

Ich habe etwas recherchiert und die JaCoCo-Code-Coverage-Bibliothek gefunden. Es sah interessant aus und ich beschloss, es zu versuchen.

Das Problem war, dass die Konfiguration sehr schwierig war und viel Zeit in Anspruch nahm. Ich habe zahlreiche Tutorials gelesen, nur um herauszufinden, dass die darin enthaltenen Anweisungen bei mir nicht funktioniert haben. Dann bin ich auf diesen Blogpost gestoßen und alles hat seinen Platz gefunden.

Obwohl dieser Blogbeitrag für mich äußerst wertvoll war, ist er etwas vage. Ich hielt eine ausführlichere Erläuterung der Verwendung des JaCoCo-Maven-Plug-ins für wertvoll.

Dieser Blogbeitrag beschreibt, wie wir Codeabdeckungsberichte für Unit- und Integrationstests mit dem JaCoCo-Maven-Plug-in erstellen können.

Die Anforderungen unseres Builds lauten wie folgt:

  • Unser Build muss Codeabdeckungsberichte für Einheiten- und Integrationstests erstellen, wenn die Tests ausgeführt werden.
  • Die Codeabdeckungsberichte müssen in separaten Verzeichnissen erstellt werden. Mit anderen Worten, der Code-Coverage-Bericht für Komponententests muss in einem anderen Verzeichnis erstellt werden als der Code-Coverage-Bericht für Integrationstests.

Fangen wir an.

Hinweis :Die Beispielanwendung dieses Blogposts basiert auf der Beispielanwendung meines Blogposts namens Integration Testing with Maven. Wenn Sie es noch nicht gelesen haben, empfehle ich Ihnen, es zu lesen, bevor Sie diesen Blogbeitrag lesen.

Konfigurieren des JaCoCo Maven Plugins

Wir verwenden das JaCoCo Maven Plugin für zwei Zwecke:

  1. Er bietet uns Zugriff auf den JaCoCo-Laufzeitagenten, der Ausführungsabdeckungsdaten aufzeichnet.
  2. Es erstellt Codeabdeckungsberichte aus den vom JaCoCo-Laufzeitagenten aufgezeichneten Ausführungsdaten.

Wir können das JaCoCo Maven Plugin konfigurieren, indem wir diesen Schritten folgen:

  1. Fügen Sie das JaCoCo Maven-Plugin zu den Plugins hinzu Abschnitt unserer POM-Datei.
  2. Konfigurieren Sie den Codeabdeckungsbericht für Einheitentests.
  3. Konfigurieren Sie den Codeabdeckungsbericht für Integrationstests.

Diese Schritte werden im Folgenden ausführlicher beschrieben.

Hinzufügen des JaCoCo Maven Plugins zur POM-Datei

Wir können das JaCoCo-Maven-Plugin zu unserer POM-Datei hinzufügen, indem wir die folgende Plugin-Deklaration zu seinen Plugins hinzufügen Abschnitt:

<plugin>
	<groupId>org.jacoco</groupId>
	<artifactId>jacoco-maven-plugin</artifactId>
	<version>0.7.5.201505241946</version>
</plugin>

Fahren wir fort und finden heraus, wie wir den Codeabdeckungsbericht für unsere Einheitentests konfigurieren können.

Konfigurieren des Codeabdeckungsberichts für Einheitentests

Wir können den Codeabdeckungsbericht für Komponententests konfigurieren, indem wir der Plugin-Deklaration zwei Ausführungen hinzufügen. Diese Ausführungen werden im Folgenden beschrieben:

  1. Die erste Ausführung erstellt eine Eigenschaft, die auf den JaCoCo-Laufzeitagenten zeigt. Stellen Sie sicher, dass die Ausführungsdaten in die Datei target/coverage-reports/jacoco-ut.exec geschrieben werden . Legen Sie den Namen der Eigenschaft auf surefireArgLine fest . Der Wert dieser Eigenschaft wird als VM-Argument übergeben, wenn unsere Komponententests ausgeführt werden.
  2. Die zweite Ausführung erstellt den Codeabdeckungsbericht für Komponententests, nachdem die Komponententests ausgeführt wurden. Stellen Sie sicher, dass die Ausführungsdaten aus der Datei target/coverage-reports/jacoco-ut.exec gelesen werden und dass der Codeabdeckungsbericht in das Verzeichnis target/site/jacoco-ut geschrieben wird .

Der relevante Teil unserer Plugin-Konfiguration sieht wie folgt aus:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.5.201505241946</version>
    <executions>
        <!--
            Prepares the property pointing to the JaCoCo runtime agent which
            is passed as VM argument when Maven the Surefire plugin is executed.
        -->
        <execution>
            <id>pre-unit-test</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <!-- Sets the path to the file which contains the execution data. -->
                <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                <!--
                    Sets the name of the property containing the settings
                    for JaCoCo runtime agent.
                -->
                <propertyName>surefireArgLine</propertyName>
            </configuration>
        </execution>
        <!--
            Ensures that the code coverage report for unit tests is created after
            unit tests have been run.
        -->
        <execution>
            <id>post-unit-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <!-- Sets the path to the file which contains the execution data. -->
                <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                <!-- Sets the output directory for the code coverage report. -->
                <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Lassen Sie uns herausfinden, wie wir den Codeabdeckungsbericht für unsere Integrationstests konfigurieren können.

Konfigurieren des Codeabdeckungsberichts für Integrationstests

Wir können den Codeabdeckungsbericht für Integrationstests konfigurieren, indem wir der Plugin-Deklaration zwei Ausführungen hinzufügen. Diese Ausführungen werden im Folgenden beschrieben:

  1. Diese erste Ausführung erstellt eine Eigenschaft, die auf den JaCoCo-Laufzeitagenten zeigt. Stellen Sie sicher, dass die Ausführungsdaten in die Datei target/coverage-reports/jacoco-it.exec geschrieben werden . Legen Sie den Namen der Eigenschaft auf failsafeArgLine fest . Der Wert dieser Eigenschaft wird als VM-Argument übergeben, wenn unsere Integrationstests ausgeführt werden.
  2. Erstellen Sie eine Ausführung, die den Codeabdeckungsbericht für Integrationstests erstellt, nachdem Integrationstests ausgeführt wurden. Stellen Sie sicher, dass die Ausführungsdaten aus der Datei target/coverage-reports/jacoco-it.exec gelesen werden und dass der Codeabdeckungsbericht in das Verzeichnis target/site/jacoco-it geschrieben wird .

Der relevante Teil unserer Plugin-Konfiguration sieht wie folgt aus:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.5.201505241946</version>
    <executions>
		<!-- The Executions required by unit tests are omitted. -->
        <!--
            Prepares the property pointing to the JaCoCo runtime agent which
            is passed as VM argument when Maven the Failsafe plugin is executed.
        -->
        <execution>
            <id>pre-integration-test</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <!-- Sets the path to the file which contains the execution data. -->
                <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
                <!--
                    Sets the name of the property containing the settings
                    for JaCoCo runtime agent.
                -->
                <propertyName>failsafeArgLine</propertyName>
            </configuration>
        </execution>
        <!--
            Ensures that the code coverage report for integration tests after
            integration tests have been run.
        -->
        <execution>
            <id>post-integration-test</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <!-- Sets the path to the file which contains the execution data. -->
                <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
                <!-- Sets the output directory for the code coverage report. -->
                <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Das ist es. Wir haben nun das JaCoCo Maven Plugin konfiguriert. Unser nächster Schritt ist die Konfiguration des Maven Surefire-Plugins. Lassen Sie uns herausfinden, wie wir dies tun können.

Konfigurieren des Maven Surefire-Plugins

Wir verwenden das Maven Surefire-Plugin, um die Unit-Tests unserer Beispielanwendung auszuführen. Da wir für unsere Unit-Tests einen Codeabdeckungsbericht erstellen möchten, müssen wir sicherstellen, dass der JaCoCo-Agent ausgeführt wird, wenn unsere Unit-Tests ausgeführt werden. Wir können dies sicherstellen, indem wir den Wert der surefireArgLine hinzufügen -Eigenschaft als Wert von argLine Konfigurationsparameter.

Die Konfiguration des Maven Surefire-Plugins sieht wie folgt aus (die erforderliche Änderung ist hervorgehoben):

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-plugin</artifactId>
	<version>2.15</version>
	<configuration>
		<!-- Sets the VM argument line used when unit tests are run. -->
		<argLine>${surefireArgLine}</argLine>
		<!-- Skips unit tests if the value of skip.unit.tests property is true -->
		<skipTests>${skip.unit.tests}</skipTests>
		<!-- Excludes integration tests when unit tests are run. -->
		<excludes>
			<exclude>**/IT*.java</exclude>
		</excludes>
	</configuration>
</plugin>

Wir sind fast fertig. Das einzige, was wir noch tun müssen, ist das Maven Failsafe-Plugin zu konfigurieren. Lassen Sie uns herausfinden, wie wir es tun können.

Konfigurieren des Maven Failsafe-Plugins

Die Integrationstests unserer Beispielanwendung werden vom Maven Failsafe-Plugin ausgeführt. Da wir einen Codeabdeckungsbericht für unsere Integrationstests erstellen möchten, müssen wir sicherstellen, dass der JaCoCo-Agent ausgeführt wird, wenn unsere Integrationstests ausgeführt werden. Wir können dies tun, indem wir den Wert der failsafeArgLine hinzufügen -Eigenschaft als Wert von argLine Konfigurationsparameter.

Die Konfiguration des Maven Failsafe Plugins sieht wie folgt aus (die erforderliche Änderung ist hervorgehoben):

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-failsafe-plugin</artifactId>
	<version>2.15</version>
	<executions>
		<!--
			Ensures that both integration-test and verify goals of the Failsafe Maven
			plugin are executed.
		-->
		<execution>
			<id>integration-tests</id>
			<goals>
				<goal>integration-test</goal>
				<goal>verify</goal>
			</goals>
			<configuration>
				<!-- Sets the VM argument line used when integration tests are run. -->
				<argLine>${failsafeArgLine}</argLine>
				<!--
					Skips integration tests if the value of skip.integration.tests property
					is true
				-->
				<skipTests>${skip.integration.tests}</skipTests>
			</configuration>
		</execution>
	</executions>
</plugin>

Codeabdeckungsberichte erstellen

Wir haben die erforderliche Konfiguration nun erfolgreich abgeschlossen. Sehen wir uns an, wie wir Codeabdeckungsberichte für Einheiten- und Integrationstests erstellen können.

Die Beispielanwendung dieses Blogbeitrags hat drei Build-Profile, die im Folgenden beschrieben werden:

  • Der Entwickler Das Profil wird während der Entwicklung verwendet und ist das Standardprofil unseres Builds. Wenn dieses Profil aktiv ist, werden nur Komponententests ausgeführt.
  • Der Integrationstest Profil wird verwendet, um Integrationstests auszuführen.
  • Die Alle-Tests Profil wird verwendet, um sowohl Komponenten- als auch Integrationstests auszuführen.

Wir können verschiedene Codeabdeckungsberichte erstellen, indem wir die folgenden Befehle an der Eingabeaufforderung ausführen:

  • Der Befehl mvn clean test führt Unit-Tests aus und erstellt den Codeabdeckungsbericht für Unit-Tests im Verzeichnis target/site/jacoco-ut .
  • Der Befehl mvn clean verify -P integration-test führt Integrationstests aus und erstellt den Codeabdeckungsbericht für Integrationstests im Verzeichnis target/site/jacoco-it .
  • Der Befehl mvn clean verify -P all-tests führt Einheiten- und Integrationstests durch und erstellt Codeabdeckungsberichte für Einheiten- und Integrationstests.

Das ist alles für heute. Die Beispielanwendung dieses Blogbeitrags ist wie immer auf Github verfügbar.


Java-Tag