7

pom.xml にこのプラグイン コードがあります。このプラグインを削除すると、Maven は単体テストを 2 回実行しなくなります。このプラグインのどの部分で単体テストが 2 回実行されるのか知りたかっただけです。

<plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-clover2-plugin</artifactId>
    <version>3.0.4</version>
    <configuration>
        <licenseLocation>/location/to/clover.license</licenseLocation>
        <generateXml>true</generateXml>
        <generateHtml>true</generateHtml>
    </configuration>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>instrument</goal>
            </goals>
        </execution>
        <execution>
            <id>main</id>
            <phase>verify</phase>
            <goals>
                <goal>instrument</goal>
                <goal>aggregate</goal>
                <goal>clover</goal>
            </goals>
        </execution>
        <execution>
            <id>site</id>
            <phase>pre-site</phase>
            <goals>
                <goal>instrument</goal>
                <goal>aggregate</goal>
            </goals>
        </execution>
    </executions>
</plugin>
4

2 に答える 2

9

clover プラグインtestは、インストルメント化されたクラスパスを使用して、ライフサイクルをフェーズまでフォークします。

標準的なライフ サイクルでテストが実行されます (通常、フェーズで Surefire を使用しますが、test複数の実行や、そのフェーズでテストを呼び出す他のテスト プラグインが存在する可能性があります)。

その後、クローバーがやってきて、もう一度走らせるように頼みます。

さて、私の標準的な警告のために:

  • コード カバレッジは、JVM 仕様の下で正当な方法で実行されるバイト コードを変更します。
  • このような変換により、カバレッジ マップの更新中に同期ポイントが追加される可能性があります。
  • このような追加の同期ポイントは、JVM が実行できる操作の並べ替えを制限する可能性があります。
  • スレッド関連ではなく、説明が複雑な変更が他にもあります。

カバレッジをオンにしてのみテスト ケースを実行した場合、カバレッジによってバグが隠される可能性があるため、100% の合格率を信頼することはできません。

逆に、カバレッジをオンにして実行したことがない場合、JVM アーキテクチャーの変更により、知らなかった新しいバグが明らかになる可能性があります。

  • カバレッジがオンの場合とオフの場合のテストに合格 => おそらく問題ありません

  • カバレッジをオンにするとテストに合格し、オフにすると失敗します => 注意してください、ここにバグがあります

  • カバレッジをオフにするとテストは成功し、オンにすると失敗します => テストがタイミング クリティカルでない場合はここでバグが発生しますが、本番環境でテストを実行する場合-serverは、ホット パスを完全に最適化した場合にのみバグが発生する可能性があります

  • カバレッジがオンの場合とオフの場合でテストが失敗する => バグ

"Stephen の黄金律:いまいましいテストを 2 回実行するだけ"

于 2013-04-03T23:13:36.143 に答える
0

使用している clover2:instrument ゴールは、並列ビルド ライフ サイクルをフォークするように機能します。このおかげで、ビルド中に生成されたすべてのアーティファクト (クラス、jar など) は /target/clover ディレクトリに配置されるか、-clover.jar サフィックスが付きます。これにより、「通常の」コード (つまり、インストルメント化されていない) とインストルメント化されたコードが確実に分離されます。

そのような分離が必要ない場合 (たとえば、「mvn deploy」ではなく「mvn test」を実行する場合)、clover2:instrument の代わりに clover2:setup を使用することをお勧めします。

http://docs.atlassian.com/maven-clover2-plugin/latest/setup-mojo.html

于 2013-11-05T20:16:37.147 に答える