Java >> Java-zelfstudie >  >> Tag >> maven

Integratie- en Unit-testrapporten samenvoegen met JaCoCo

Ik heb dit onlangs geïmplementeerd:na wat kopzorgen en veel testen heb ik een configuratie die prachtig werkt.

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>${jacoco.version}</version>
    <executions>
        <execution>
            <id>pre-unit-test</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                <propertyName>surefireArgLine</propertyName>
            </configuration>
        </execution>
        <execution>
            <id>pre-integration-test</id>
            <goals>
                <goal>prepare-agent-integration</goal>
            </goals>
            <configuration>
                <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
                <propertyName>testArgLine</propertyName>
            </configuration>
        </execution>
        <execution>
            <id>post-integration-test</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
                <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
            </configuration>
        </execution>
        <execution>
            <id>post-unit-test</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
            </configuration>
        </execution>
        <execution>
            <id>merge-results</id>
            <phase>verify</phase>
            <goals>
                <goal>merge</goal>
            </goals>
            <configuration>
                <fileSets>
                    <fileSet>
                        <directory>${project.build.directory}/coverage-reports</directory>
                        <includes>
                            <include>*.exec</include>
                        </includes>
                    </fileSet>
                </fileSets>
                <destFile>${project.build.directory}/coverage-reports/aggregate.exec</destFile>
            </configuration>
        </execution>
        <execution>
            <id>post-merge-report</id>
            <phase>verify</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <dataFile>${project.build.directory}/coverage-reports/aggregate.exec</dataFile>
                <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <argLine>${surefireArgLine}</argLine>
        <skipTests>${skip.unit.tests}</skipTests>
        <includes>
            <include>**/*UT.java</include>
            <include>**/*MT.java</include>
            <include>**/*Test.java</include>
        </includes>
        <skipTests>${skipUTMTs}</skipTests>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.12.4</version>
    <configuration>
        <skipTests>${skipTests}</skipTests>
        <skipITs>${skipITs}</skipITs>
        <argLine>${testArgLine}</argLine>
        <excludes>
            <exclude>**/*UT*.java</exclude>
        </excludes>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Zoals u kunt zien, zijn er 6 verschillende Jacoco-uitvoeringen om de tests uit te voeren, de bestanden samen te voegen en een geaggregeerd rapport te maken. Naast de Jacoco-configuratie moet je ook Surefire en Failsafe configureren om een ​​argument van Jacoco te accepteren (Surefire voert de unittests uit en Failsafe voert de integratietests uit).

Alle configuratie die ik heb gebruikt, zou er moeten zijn, wat je ermee doet, is je ontwerparchitectuur om het binnen je gewenste vereisten te laten passen. Persoonlijk raad ik aan om te kijken naar wat ik uitsluit en opneem in trefzeker en failsafe als je problemen hebt met bestanden die niet worden gelezen.


Niet het antwoord dat je zoekt, maar toch...

In de meeste gevallen moet u de dekking van unit- en integratietests niet samenvoegen.

De waarde van unit-tests is dat ze het ontwerp van uw applicatie verbeteren en ervoor zorgen dat de hoekpunten van uw code correct werken. U moet proberen een hoge dekking van uw unit-tests te krijgen.

De waarde van uw integratietests is dat ze ervoor zorgen dat de belangrijkste use-cases van uw applicatie correct werken en dat de hele stack correct wordt geïntegreerd. U moet proberen een hoge functionele dekking te hebben voor uw integratietests. (Maar het is vrij moeilijk om functionele dekking te meten met een tool).

Als u integratietests nodig heeft om de dekking van uw vestigingen te verbeteren, is dat een sterke aanwijzing dat u het ontwerp van uw code moet herzien. En als u al een hoge vestigingsdekking heeft zonder integratietests, zou het toevoegen ervan uw statistieken niet significant moeten wijzigen.

Voel je vrij om dit antwoord naar beneden te stemmen, want het is een beetje een onderwerp en nogal eigenwijs...


U moet een kijkje nemen in de documentatie van de JaCoCo Maven-plug-in die een merge . bevat doel.


Java-tag