12

Java コードを使用したマルチモジュール Maven セットアップがあります。

私の単体テストは、モジュールの 1 つで、複数のモジュールでコードを実行します。当然のことながら、モジュールには相互依存関係があり、関連するすべてのモジュールのコードは、テスト実行の前に必要に応じてコンパイルされます。

では、コードベース全体のカバレッジに関するレポートを取得するにはどうすればよいでしょうか?


注: 複数のモジュールでのテストのカバレッジ結果を組み合わせる方法を尋ねているわけではありません。複数のモジュールからインストルメント化されたコードを使用して、単一のモジュールでテストのカバレッジを取得する方法を尋ねています。前者に興味のある人は、これら の他の 質問と、Crowne によるMaven DashboardSonarの推奨事項を参照してください。

純粋な Ant を使用して完全なカバレッジ レポートを取得することに成功しました 。[編集:] development-runtime ディレクトリのすべての jar を一時ディレクトリにインストルメント化しました。クラスパスの先頭に一時ディレクトリを追加しました。次に、 batch-test を使用して Ant からテストを実行しまし

Ant は Maven から実行できますが、ここでの課題はシームレスな統合 (つまり、すべてのクラスパスとソースパスの要素を Maven から Ant に自動的に供給すること) です。そのため、この目的で Maven の機能を使用しませんでした。

統合テストに関する他の 質問もあります。ただし、既定では、各プロジェクトのレポートは同じプロジェクト内のコードのカバレッジのみを報告しますが、私のテストでは複数のプロジェクトでコードを実行します。

スペイン語のこの記事が関連している可能性があります。別のSeam 固有の記事を次に示します。


4

5 に答える 5

6

Thomas Sundberg によるこの最近のブログ投稿には、maven cobertura プラグインを使用する代わりに、cobertura 呼び出しに ant を使用して問題を部分的に解決する方法が含まれています。

これは、特殊な pom.xml および build.xml ファイルを使用した次の基本的なアプローチに依存しています。

親 pom での典型的な maven コンパイルから始めます。これにより、子モジュール内のすべてのクラスがコンパイルされます。

mvn clean compile # maven-compile-plugin called for compiling

次に、すべてのモジュール クラスを計測します。

ant instrument # cobertura called for instrumentation

次に、cobertura をテスト依存関係として、インストルメント化されたクラスを使用して、テスト用に呼び出された maven-surefire-plugin を呼び出します。

mvn test 

次に、カスタム レポート呼び出しを使用して、さまざまなモジュールからすべての結果を取り込みます。

ant report # cobertura called for reporting

ant build.xml ファイルの重要な要素は、すべてのモジュールを個別に計測し、結果をマージした後にすべてのモジュールについてレポートすることです。この関数は、彼の例のモジュールごとに呼び出す必要があります。

<target name="instrumentAModule">
    <property name="classes.dir" value="target/classes"/>
    <cobertura-instrument todir="./${module}/${classes.dir}">
        <fileset dir="./${module}/target/classes">
            <include name="**/*.class"/>
        </fileset>
    </cobertura-instrument>
</target>

次に、テストが完了した後、レポート フェーズで最初に、すべての異なるディレクトリからのすべての結果が新しい .ser ファイル (この例では sum.ser と呼ばれる) にマージされます。

<target name="report" depends="merge">
    <property name="src.dir" value="src/main/java/"/>
    <cobertura-report datafile="sum.ser"
                      format="html"
                      destdir="./target/report">
        <!-- Add all modules that should be included below -->
        <!-- fileset dir="./MODULE_NAME_TO_REPLACE/${src.dir}"/ -->
        <fileset dir="./product/${src.dir}"/>
    </cobertura-report>
</target>

<target name="merge">
    <cobertura-merge datafile="sum.ser">
        <fileset dir=".">
            <include name="**/cobertura.ser"/>
        </fileset>
    </cobertura-merge>
</target>

antrunプラグインを使用してantコンポーネントをmavenに統合することは可能かもしれませんが、フェーズ/ライフサイクルに精通していないため、さまざまな呼び出しをどこに置くかを知ることができません.

これは、API モジュールで抽象テスト クラスを作成し、lib モジュールで実装を提供するので、私にとって非常に便利です。これまでのところ、cobertura と emma の両方がこの設計を処理できていないため、私のコード カバレッジは通常 0 または 1 桁です。

于 2012-02-29T03:07:10.850 に答える
4

試したことはありませんが、これはそれを達成する方法かもしれません:

  • 各モジュールで、インストールフェーズの直前に、cobertura が jar ファイルを計測し、計測された jar ファイル (!) をローカルの Maven リポジトリにインストールします。
  • tests-module では、Maven はローカルの Maven リポジトリからアーティファクトの依存関係を使用してテストを実行します。これらのインストルメント化されたクラスは、cobertura.ser などのデータファイルに表示されます。
  • プロジェクトの tests-module 内から通常どおり cobertura-report 生成を実行します。mvn site

coberturaを手動で呼び出して外部 JAR ファイルをインプレースで計測する方法については、 cobertura のドキュメントを参照してください。

... また、jar ファイルを渡して、標準の ant ファイルセットを使用して計測することもできます。Cobertura は jar から各クラスを抽出し、インストルメント化します。「todir」が指定されていない場合、元の jar はインストルメント化されたバージョンで上書きされます...

pom.xmlビルド プラグインは次のようになります。ローカル リポジトリでそれらを上書きしたくない場合は、プロファイルを追加するか、分類子を使用して、最終的な jar ファイルとインストルメント化された jar ファイルを区別することができます。次に、tests モジュールで、分類子を使用して他のモジュールへの依存関係を定義するだけです。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>cobertura-inplace-instrumentation</id>
                    <phase>package</phase>
                    <configuration>
                        <tasks>
                            <taskdef classpathref="maven.plugin.classpath" resource="tasks.properties" />
                            <cobertura-instrument
                                datafile="${project.build.directory}/cobertura-nop.ser">
                                <fileset dir="${project.build.directory}">
                                    <include name="${project.build.finalName}.${project.packaging}" />
                                </fileset>
                            </cobertura-instrument>
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>net.sourceforge.cobertura</groupId>
                    <artifactId>cobertura</artifactId>
                    <version>1.9.4.1</version>
                </dependency>
            </dependencies>
        </plugin>
于 2011-01-19T23:20:17.513 に答える
2

一般に、レポートは特定のモジュールに関連していますが、集計することはできます。次の
2 つの方法があります。

ソナーを使用してレポートを集計することをお勧めします。

彼らの公開インスタンス「nemo」を参照して、提供されている優れた機能を確認してください。

于 2011-01-19T20:16:41.610 に答える
0

私はこれをかなり簡単に見つけました(私はしばらく前にそれをしましたが、詳細で錆びているかもしれません...

私のコアプロジェクトには、すべてのモジュールが含まれています。Coberturaを使用してテストカバレッジを測定します。私は継続的インテグレーションエンジンとしてHudsonを使用しており、Hudson用のCoberturaプラグインを持っています。

それは今しばらくの間御馳走を働いています。

幸運を !

于 2011-01-19T19:46:09.313 に答える
0

カバレッジ情報は、コンパイルされたクラスを計測することによってcobertura/emmaによって取得されるため、可能かどうかは疑問です。これは指定されたプロジェクト内のクラスでは機能しますが、これらのツールが依存ライブラリをインストルメント化するかどうかは疑わしいです。

maven cobertura プラグインの使用法を見ても、そのような可能性は示されていないようです。

于 2011-01-18T02:17:45.490 に答える