Java >> Java tutorial >  >> Tag >> maven

Oprettelse af kodedækningsrapporter til enheds- og integrationstest med JaCoCo Maven-plugin

Da jeg begyndte at bruge Java 7, bemærkede jeg med det samme, at Cobertura Maven-plugin'et ikke understøtter det. Dette var et stort problem for mig, fordi jeg brugte kodedækningsrapporter hver dag.

Jeg foretog nogle undersøgelser og fandt JaCoCo-kodedækningsbiblioteket. Det så interessant ud, og jeg besluttede at give det et skud.

Problemet var, at det var virkelig svært at konfigurere det og tog meget tid. Jeg læste adskillige tutorials bare for at finde ud af, at instruktionerne i dem ikke virkede for mig. Så løb jeg ind i dette blogindlæg, og alt falder på plads.

Selvom det blogindlæg var ekstremt værdifuldt for mig, er det lidt vagt. Jeg følte, at en mere detaljeret forklaring om brugen af ​​JaCoCo Maven-pluginet ville være værdifuld.

Dette blogindlæg beskriver, hvordan vi kan oprette kodedækningsrapporter til enheds- og integrationstests ved at bruge JaCoCo Maven plugin.

Kravene til vores build er følgende:

  • Vores build skal oprette kodedækningsrapporter for både enheds- og integrationstest, når testene køres.
  • Kodedækningsrapporterne skal oprettes i separate mapper. Med andre ord skal kodedækningsrapporten for enhedstest oprettes i en anden mappe end kodedækningsrapporten for integrationstest.

Lad os komme i gang.

Bemærk :Eksempelapplikationen af ​​dette blogindlæg er baseret på eksempelapplikationen af ​​mit blogindlæg kaldet Integration Testing with Maven. Hvis du ikke har læst den endnu, anbefaler jeg, at du læser den, inden du læser dette blogindlæg.

Konfiguration af JaCoCo Maven-plugin

Vi bruger JaCoCo Maven plugin til to formål:

  1. Det giver os adgang til JaCoCo runtime-agenten, som registrerer data om eksekveringsdækning.
  2. Det opretter kodedækningsrapporter ud fra de udførelsesdata, der er registreret af JaCoCo-runtime-agenten.

Vi kan konfigurere JaCoCo Maven plugin ved at følge disse trin:

  1. Tilføj JaCoCo Maven-plugin til plugins afsnittet i vores POM-fil.
  2. Konfigurer kodedækningsrapporten til enhedstests.
  3. Konfigurer kodedækningsrapporten til integrationstests.

Disse trin er beskrevet med flere detaljer i det følgende.

Tilføjelse af JaCoCo Maven-plugin til POM-filen

Vi kan tilføje JaCoCo Maven-plugin til vores POM-fil ved at tilføje følgende plugin-erklæring til dets plugins afsnit:

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

Lad os gå videre og finde ud af, hvordan vi kan konfigurere kodedækningsrapporten til vores enhedstests.

Konfiguration af kodedækningsrapporten til enhedstests

Vi kan konfigurere kodedækningsrapporten til enhedstests ved at tilføje to udførelser til plugin-erklæringen. Disse udførelser er beskrevet i det følgende:

  1. Den første udførelse opretter en egenskab, som peger på JaCoCo-runtime-agenten. Sørg for, at udførelsesdataene er skrevet til filen target/coverage-reports/jacoco-ut.exec . Indstil navnet på egenskaben til surefireArgLine . Værdien af ​​denne egenskab sendes som et VM-argument, når vores enhedstest køres.
  2. Den anden udførelse opretter kodedækningsrapporten for enhedstest, efter at enhedstest er blevet kørt. Sørg for, at udførelsesdataene læses fra filen target/coverage-reports/jacoco-ut.exec og at kodedækningsrapporten er skrevet til mappen target/site/jacoco-ut .

Den relevante del af vores plugin-konfiguration ser ud som følger:

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

Lad os finde ud af, hvordan vi kan konfigurere kodedækningsrapporten til vores integrationstest.

Konfiguration af kodedækningsrapporten til integrationstests

Vi kan konfigurere kodedækningsrapporten til integrationstest ved at tilføje to eksekveringer til plugin-erklæringen. Disse udførelser er beskrevet i det følgende:

  1. Denne første udførelse opretter en egenskab, som peger på JaCoCo-runtime-agenten. Sørg for, at udførelsesdataene er skrevet til filen target/coverage-reports/jacoco-it.exec . Indstil navnet på egenskaben til failsafeArgLine . Værdien af ​​denne egenskab sendes som et VM-argument, når vores integrationstest køres.
  2. Opret en udførelse, som opretter kodedækningsrapporten for integrationstests, efter at integrationstest er blevet kørt. Sørg for, at udførelsesdataene læses fra filen target/coverage-reports/jacoco-it.exec og at kodedækningsrapporten er skrevet til mappen target/site/jacoco-it .

Den relevante del af vores plugin-konfiguration ser ud som følger:

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

Det er det. Vi har nu konfigureret JaCoCo Maven plugin. Vores næste trin er at konfigurere Maven Surefire plugin. Lad os finde ud af, hvordan vi kan gøre dette.

Konfiguration af Maven Surefire Plugin

Vi bruger Maven Surefire-plugin'et til at køre enhedstesten af ​​vores eksempelapplikation. Fordi vi ønsker at oprette en kodedækningsrapport for vores enhedstest, skal vi sikre, at JaCoCo-agenten kører, når vores enhedstest køres. Vi kan sikre dette ved at tilføje værdien af ​​surefireArgLine egenskab som værdien af ​​argLine konfigurationsparameter.

Konfigurationen af ​​Maven Surefire-plugin'et ser ud som følger (den nødvendige ændring er fremhævet):

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

Vi er næsten færdige. Det eneste, der er tilbage for os at gøre, er at konfigurere Maven Failsafe plugin. Lad os finde ud af, hvordan vi kan gøre det.

Konfiguration af Maven Failsafe Plugin

Integrationstestene af vores eksempelapplikation køres af Maven Failsafe plugin. Fordi vi ønsker at oprette en kodedækningsrapport for vores integrationstest, skal vi sikre, at JaCoCo-agenten kører, når vores integrationstest køres. Vi kan gøre dette ved at tilføje værdien af ​​failsafeArgLine egenskab som værdien af ​​argLine konfigurationsparameter.

Konfigurationen af ​​Maven Failsafe plugin ser ud som følger (den nødvendige ændring er fremhævet):

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

Oprettelse af kodedækningsrapporter

Vi har nu afsluttet den nødvendige konfiguration. Lad os se, hvordan vi kan oprette kodedækningsrapporter til enheds- og integrationstests.

Eksempelapplikationen af ​​dette blogindlæg har tre byggeprofiler, som er beskrevet i det følgende:

  • udvikleren profil bruges under udvikling, og det er standardprofilen for vores build. Når denne profil er aktiv, køres der kun enhedstests.
  • integrationstesten profil bruges til at køre integrationstest.
  • alle-testene profil bruges til at køre både enheds- og integrationstest.

Vi kan oprette forskellige kodedækningsrapporter ved at køre følgende kommandoer ved kommandoprompten:

  • Kommandoen mvn clean test kører enhedstests og opretter kodedækningsrapporten for enhedstest til mappen target/site/jacoco-ut .
  • Kommandoen mvn clean verify -P integration-test kører integrationstest og opretter kodedækningsrapporten for integrationstest til mappen target/site/jacoco-it .
  • Kommandoen mvn clean verify -P all-tests kører enheds- og integrationstests og opretter kodedækningsrapporter til enheds- og integrationstests.

Det var alt for i dag. Som altid er eksempelapplikationen til dette blogindlæg tilgængelig på Github.


Java tag