web-dev-qa-db-ja.com

別のテストソースフォルダーをMavenに追加し、別のフォルダーにコンパイルする方法

単体テスト用のデフォルトのsrc/test/Javaフォルダーがあります。統合テストには、別のフォルダーsrc/integration/Javaを使用できます。

maven-surefire-pluginを構成して、それぞれのフェーズでユニット/統合テストを実行しました。これは、コンパイルされたクラスが正しいディレクトリにある場合に効果的です。残念ながら、Mavenは1つのテストソースフォルダーと1つのテスト出力フォルダーのみをサポートします。

Mavensビルドヘルパープラグインを使用すると、別のテストソースフォルダーを追加できますが、コンパイルされたクラスはtest-classesに生成されますが、src/integration/Javaからtarget/integration-test-classesにクラスをコンパイルします。これは可能ですか?

src/test/Java > target/test-classes
src/integration/Java > target/integration-test-classes

PS:パッケージベースソリューションでこの除外/追加が好きではありません(すべての**/it/**ファイルをデフォルトのテストフェーズから除外し、すべての**/unit/**を統合フェーズから除外します。

35

申し訳ありませんが、それを行う方法はありません。概念は、コンパイル済みクラスとコンパイル済みテストクラス用のターゲットディレクトリが1つだけであるということです(<build>タグスキーマでも公開されます)。正直に言うと、Mavenでそれが可能になるとは本当に思っていません。 Mavenは、適切に作成されたモジュールを使用することにより、アプリケーションの直線的でクリーンで読みやすい設計を促進します。

あなたが本当にやりたいことを考えるとしたら、実際に統合テストモジュールを作成することです。それは実際、一般的な慣行です。これまでのところ、私は常に個別の統合テストモジュールを使用しており、それに関する問題は一度もありませんでした。もちろん、これらのテストを実行するには、必要なすべてのモジュールに依存する必要があります。ここで説明したように、依存関係宣言で<type>test-jar</type>を使用することで、他のモジュールのテストクラスに依存することもできます。

http://maven.Apache.org/guides/mini/guide-attached-tests.html

ただし、このメソッドは好きではありません。通常、JUnitテストケースのベースクラスなど、テストサポートのものを備えた個別のモジュールを使用することを好みます。

9

あなたが書いたものに基づいて、統合テストに正しく名前を付けなかったようで、統合テストに maven-failsafe-plugin を使用しなかったようです。 maven-failsafe-plugin の規則に基づいて、統合テストに*IT.Java。統合テストに適切な名前を付けた場合、次のような多かれ少なかれ構成でそれを処理できます。

<project ...>
  [...]
  <build>
    [...]
     <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.9.1</version>
        <executions>
          <execution>
            <id>add-test-source</id>
            <phase>generate-test-sources</phase>
            <goals>
              <goal>add-test-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/integration/Java</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
      [...]
  </build>
  [...]
</project>

上記により、同じモジュール内で統合テストを保持することができます。しかし、これでは、コンパイル済みの統合テストクラスを別のフォルダーに入れるという考えは解決しません。

場合によっては、統合テストのみを含む個別の統合テストモジュールを使用した方がよい場合があります(その結果、マルチモジュールビルドが発生します)。 Mavenの規則をそのまま残したい場合は、異なる出力パスを使用するようにmaven-compiler-pluginを構成してみてください(例:target/integration-tests/classes)実際には機能しないと思われる。

37
khmarbaise

単体テストのソースフォルダーのみを変更する(追加のフォルダーを追加するのではなく)場合は、testSourceDirectory要素を変更するだけです。

<build>
    <testSourceDirectory>${project.basedir}/src/test/groovy</testSourceDirectory>

これは、すべての単体テストがgroovyで書かれている場合に役立ちます。 (ただし、GroovyコードもコンパイルするようにMavenを構成する必要があります- groovy-Eclipse-maven-plugin または build-helper-maven-plugin を参照してください。)

10
GreenGiant