web-dev-qa-db-ja.com

統合および単体テストレポートとJaCoCoのマージ

JaCoCoプラグインを使用してmavenでフェイルセーフおよび確実なレポートを生成していますが、それらを個別のレポートでしか管理できません。全体的なカバレッジビュー(単体テストと統合テストの両方のマージ)も必要です。

私が徹底的なグーグル検索だと思った後、私はソナーでこれを行う方法しか見つけられませんでした。これを行う簡単な方法はありますか?

関連質問: Maven単体テストと統合テスト

28
raf

merge ゴールを含むJaCoCo Mavenプラグインのドキュメントをご覧ください。

9
khmarbaise

私は最近これを実装しました:いくつかの頭痛と多くのテストの後、私は美しく機能する構成を持っています。

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

ご覧のとおり、テストを実行し、ファイルをマージして集約レポートを作成するための6つの異なるJacoco実行があります。 Jacoco構成の上に、SurefireとFailsafeがJacocoから引数を取るように構成する必要もあります(Surefireは単体テストを実行し、Failsafeは統合テストを実行します)。

私が使用した構成はすべてそこにあるはずです。それを使用して、設計アーキテクチャーを作成し、必要な要件に適合させます。個人的には、ファイルが読み取られないという問題がある場合は、surefireおよびfailsafeに除外して含めるものを調べることをお勧めします。

28
Chad Van De Hey

あなたが探している答えではありませんが、それでも...

ほとんどの場合、単体テストと統合テストのカバレッジをマージしないでください。

単体テストの価値は、アプリケーションの設計を改善し、コードのコーナーケースが正しく機能することを確認することです。ユニットテストの分岐範囲を広くするようにしてください。

統合テストの価値は、アプリケーションの主なユースケースが正しく機能していること、およびスタック全体が正しく統合されていることを確認することです。統合テストの機能範囲を広くするようにしてください。 (ただし、ツールで機能カバレッジを測定することはかなり困難です)。

ブランチのカバレッジを改善するために統合テストが必要な場合は、コードの設計を確認する必要があることを強く示しています。また、統合テストなしで既に高いブランチカバレッジを持っている場合、それらを追加してもメトリックが大幅に変更されることはありません。

この回答はトピックの一部であり、かなり意見が多いため、この回答に自由に投票してください...

21
Guillaume

Chadの答えに加えて、ここに私の構成があります。 jacocoという名前の個別のプロファイルとして構成されているため、簡単にオン/オフを切り替えることができます。デフォルトの構成のみを使用します。単体テスト用の個別のコードカバレッジレポート、統合テスト用の個別のコードカバレッジレポート、および組み合わせたコードカバレッジレポートを作成できます。

    <profile>
        <id>jacoco</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>pre-unit-test</id>
                            <goals>
                                <goal>prepare-agent</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>post-unit-test</id>
                            <phase>test</phase>
                            <goals>
                                <goal>report</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>pre-integration-test</id>
                            <goals>
                                <goal>prepare-agent-integration</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>post-integration-test</id>
                            <goals>
                                <goal>report-integration</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>merge-results</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>merge</goal>
                            </goals>
                            <configuration>
                                <fileSets>
                                    <fileSet>
                                        <directory>${project.build.directory}</directory>
                                        <includes>
                                            <include>*.exec</include>
                                        </includes>
                                        <excludes>
                                            <exclude>aggregate.exec</exclude>
                                        </excludes>
                                    </fileSet>
                                </fileSets>
                                <destFile>${project.build.directory}/aggregate.exec</destFile>
                            </configuration>
                        </execution>
                        <execution>
                            <id>post-merge-report</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>report</goal>
                            </goals>
                            <configuration>
                                <dataFile>${project.build.directory}/aggregate.exec</dataFile>
                                <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
1

おそらくもっと良い方法は、同じjacocoファイルを使用することですが、それは別のテストに任せてください。

            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.1</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <skip>${maven.surefire.skipTests}</skip>
                            <propertyName>maven.surefire.argLine</propertyName>
                            <!-- using the same dest file for both UT and IT -->
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-prepare-agent-integration</id>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                        <configuration>
                            <skip>${maven.failsafe.skipTests}</skip>
                            <propertyName>maven.failsafe.argLine</propertyName>
                            <!-- append to the UT dest file -->
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                            <append>true</append>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>${maven.surefire.skipTests}</skipTests>
                <failIfNoTests>${maven.surefire.failIfNoTests}</failIfNoTests>
                <!-- allow argLine to be modified by other plugins, e.g. jacoco -->
                <argLine>@{maven.surefire.argLine}</argLine>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <skipTests>${maven.failsafe.skipTests}</skipTests>
                <failIfNoTests>${maven.failsafe.failIfNoTests}</failIfNoTests>
                <!-- allow argLine to be modified by other plugins, e.g. jacoco -->
                <argLine>@{maven.failsafe.argLine}</argLine>
            </configuration>
        </plugin>
1
Cipous