9

私が持っているMavenを使用して構築されたJavaプロジェクトを想像してみてください。

  • いくつかの高速実行ユニットテストは次のことを行います。
    • 開発者はコミットする前に実行する必要があります
    • 私のCIサーバー(Hudson、FWIW)は、新しいコミットを検出すると実行され、障害が発生した場合にほぼ瞬時にフィードバックを提供する必要があります
  • 次のような、実行速度の遅い自動受け入れテスト。
    • 開発者は、たとえば、障害を再現して修正するなど、必要に応じて実行できます。
    • 単体テストを正常に実行した後、CIサーバーを実行する必要があります

これは典型的なシナリオのようです。現在、私は実行しています:

  • 「テスト」フェーズでのユニットテスト
  • 「検証」フェーズでの受け入れテスト

2つのCIジョブが構成されており、どちらもプロジェクトのVCSブランチを指しています。

  1. 「コミットステージ」は、「mvnパッケージ」(コードのコンパイルと単体テスト、アーティファクトのビルド)を実行し、成功すると次のようにトリガーします。
  2. 「mvnverify」を実行する「AutomatedAcceptanceTests」(受け入れテストのセットアップ、実行、破棄)

問題は、ジョブ2の単体テストで、テスト対象のアーティファクトをもう一度ビルドすることです(検証フェーズでパッケージフェーズが自動的に呼び出されるため)。これは、いくつかの理由で望ましくありません(重要性が低下するため)。

  • ジョブ2によって作成されたアーティファクトは、ジョブ1によって作成されたアーティファクトと同一ではない可能性があります(たとえば、その間に新しいコミットがあった場合)
  • コミットを行った開発者へのフィードバックループを長くします(つまり、ビルドが壊れたことを見つけるのに時間がかかります)
  • CIサーバーのリソースを浪費します

だから私の質問は、ジョブ1によって作成されたアーティファクトを使用するようにジョブ2を構成するにはどうすればよいですか?

「mvnverify」を実行するCIジョブを1つだけ持つことができ、アーティファクトを1回だけ作成できることに気付きましたが、Farleyスタイルのデプロイメントパイプラインを実装するために、上記の個別のCIジョブが必要です。


誰かに役立つ場合は、受け入れられた回答の「プロジェクト2」の完全なMaven2POMを次に示します。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.cake</groupId>
    <artifactId>cake-acceptance</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <name>Cake Shop Acceptance Tests</name>
    <description>
        Runs the automated acceptance tests for the Cake Shop web application.
    </description>
    <build>
        <plugins>
            <!-- Compiler -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <!-- Suppress the normal "test" phase; there's no unit tests -->
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <!-- Cargo (starts and stops the web container) -->
            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>1.0.5</version>
                <executions>
                    <execution>
                        <id>start-container</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>start</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>stop-container</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- Don't wait for CTRL-C after starting the container -->
                    <wait>false</wait>

                    <container>
                        <containerId>jetty7x</containerId>
                        <type>embedded</type>
                        <timeout>20000</timeout>
                    </container>

                    <configuration>
                        <properties>
                            <cargo.servlet.port>${http.port}</cargo.servlet.port>
                        </properties>
                        <deployables>
                            <deployable>
                                <groupId>${project.groupId}</groupId>
                                <artifactId>${target.artifactId}</artifactId>
                                <type>war</type>
                                <properties>
                                    <context>${context.path}</context>
                                </properties>
                            </deployable>
                        </deployables>
                    </configuration>
                </configuration>
            </plugin>
            <!-- Failsafe (runs the acceptance tests) -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>integration-test</id>
                        <goals>
                            <goal>integration-test</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>verify</id>
                        <goals>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includes>
                        <include>**/*Test.java</include>
                    </includes>
                    <skipTests>false</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
            <!-- Add your tests' dependencies here, e.g. Selenium or Sahi,
                with "test" scope -->
        <dependency>
            <!-- The artifact under test -->
            <groupId>${project.groupId}</groupId>
            <artifactId>${target.artifactId}</artifactId>
            <version>${target.version}</version>
            <type>war</type>
        </dependency>
    </dependencies>
    <properties>
        <!-- The artifact under test -->
        <target.artifactId>cake</target.artifactId>
        <target.version>0.1.0-SNAPSHOT</target.version>
        <context.path>${target.artifactId}</context.path>
        <http.port>8081</http.port>
        <java.version>1.6</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

この「テスト」プロジェクトはアーティファクトを作成しませんが、何らかのパッケージを使用する必要があることに注意してください(ここでは「jar」を使用しました)。そうでない場合、検証フェーズでテストは実行されません。

4

5 に答える 5

4

2 つの Maven プロジェクトを試してください。最初のものには、ビルドと単体テストが含まれています。アーティファクトをローカル リポジトリにインストールします。2 番目のジョブは、最初のプロジェクトの成果物を依存関係として宣言し、機能テストを実行する 2 番目の Maven プロジェクトを実行します。

今説明したシナリオが可能かどうかはわかりませんが、可能だと思います。

迅速な改善のために、単体テストをバイパスできます-Dmaven.test.skip=true。scm 内のコードのリビジョン番号を 2 番目のジョブに渡すと、同じソース コードをチェックアウトできるはずです。

Clone Workspace SCM プラグインをチェックインすることもできます。これにより、いくつかの追加オプションが提供される場合があります。

于 2010-12-02T06:38:05.227 に答える
2

長い間経っていることは知っていますが、これは十分に索引付けされており、質問されたとおりの回答はありませんが、機能するものを見つけました:

mvn failsafe:integration-test

これにより、プロジェクトをビルドするためのすべての中間ステップを経ることなく、テストが直接実行されます。その後に追加することもできfailsafe:verifyます。

于 2017-04-24T07:38:21.200 に答える
0

統合テストのみを実行するために使用される Maven プロファイルを定義できます。私はこれをよくします。

このようなもの:

<profiles>
    <profile>
        <id>integration</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId><version>2.17</version>
                    <configuration>
                        <skipTests>true</skipTests>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId><version>2.4</version>
                    <configuration>
                        <outputDirectory>/tmp</outputDirectory>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

これを次のように呼び出します。

mvn verify -Pintegration

残念ながら、WAR プラグインをスキップすることはできませんが、その出力を邪魔にならない場所に送信することはできます (私は /tmp を使用しました)。本当にミリ秒を節約したい場合は、Web リソースを無視するようにすることもできます (web.xml を除く。それなしでは機能しません)。

プロファイルを使用して、アセンブリ プラグイン、Cobertura、PMD など、実行中の可能性のある他のプラグインをスキップすることもできます。

于 2015-02-25T05:59:37.630 に答える
0

私の質問は、ジョブ 1 で作成されたアーティファクトを使用するようにジョブ 2 を構成するにはどうすればよいですか?

できません。

その必要はありません。Maven ビルドのライフサイクルは、ニーズを満たすように設定されています。テスト ライフサイクルでは、高速の junits のみが実行されます。パッケージは、検証を実行せずに最終状態をビルドします。

必要な CI ジョブは 1 つだけです。CI が Maven デプロイ/インストール ライフ サイクルを実行するときに、junit がビルドに失敗すると、検証スクリプトは実行されません。

于 2010-12-02T00:43:59.893 に答える