2

外部ハードウェアデバイスを必要とするいくつかの単体テストを含む単一モジュールプロジェクトがあります。デバイスが使用可能であることを示さない限り、これらのテストを実行したくありません。

これはMavenプロパティとSureFireの除外/包含構成を使用して解決できるように感じますが、その方法がよくわかりません。同様の質問は、Mavenプロパティに基づいてプロジェクト内のすべてのテストを無効/有効にする方法を示していますが、私の問題には完全には答えていません。

要約すると**/*ResourceTest.java、Mavenプロパティを渡して有効にしない限り、実行したくないテストを説明するパターン(例)を特定したいと思います。

例えば

mvn clean install標準テストを実行しますが、デバイス関連のテストをスキップします

mvn -Drun.device.tests=true clean installすべてのテストを実行します

前もって感謝します。

「リソース」という単語の誤解を招く使用法を削除するために編集され、「ハードウェアデバイス」に置き換えられました)。

4

3 に答える 3

2

また、JUnit Assumeメソッドを使用して、テストを実行するかスキップするかを(テスト内で)決定することもできます。

ただし、IMHOの最善のオプションは、デバイス依存テストを「統合テスト」として「宣言」し、Mavenフェイルセーフプラグインで実行できるようにすることです。これは、プロファイル「マジック」のない「ビルドイン」Mavenソリューションになると思います。

于 2012-07-24T10:54:34.370 に答える
1

あなたが提供したリンクは良い答えを与えました。

正しい方法

プロファイル管理とSurefire構成の包含/除外を組み合わせて使用​​するのが正しい方法です。

リソースに応じて、なぜいくつかのテストをアクティブ化するのかを自問する必要があります。リソースは常にクラスパスにある必要があります。

そうでない場合は、いくつかのトリッキーな理由から、テストを手動でアクティブ化することをお勧めします。その場合、これはMavenの不適切な使用法であると考えてください(たとえば、離れたサーバーでこれをどのように自動化しますか?)

あなたが尋ねたこと

あなたが本当にそれをしたいのなら、私たちが気付いていないいくつかの正当な理由があるので、単にこれを使ってください:

この例では、生成されたファイルtarget /generated-sources / axistools / wsdl2java / org / apache/mavenが欠落している場合にプロファイルをトリガーします。

Maven公式ドキュメントの例:http://maven.apache.org/guides/introduction/introduction-to-profiles.html

<profiles>
  <profile>
    <activation>
      <file>
        <missing>target/generated-sources/axistools/wsdl2java/org/apache/maven</missing>
      </file>
    </activation>
    ...
  </profile>
</profiles>

Maven 2.0.9以降、タグと補間が可能です。サポートされている変数は、${user.home}のようなシステムプロパティと${env.HOME}のような環境変数です。POM自体で定義されたプロパティと値は、ここでは補間に使用できないことに注意してください。たとえば、上記の例のアクティベーターは$ {project.build.directory}を使用できませんが、パスターゲットをハードコーディングする必要があります。

あなたはここでより多くの情報を見つけることができます:http://www.sonatype.com/books/mvnref-book/reference/profiles-sect-activation.html

それがお役に立てば幸いです。あなた自身の理由(レガシーコードでさえ;))または経験で私の見解に挑戦することを躊躇しないでください

于 2012-07-24T10:44:28.477 に答える
0

@Jean-Rémyの回答を拡張するために、プロジェクトのPOMファイルで次のことを行いました。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.12</version>
      <configuration>
        <excludes>
          <exclude>${tests.to.skip}</exclude>
        </excludes>
      </configuration>
    </plugin>
  </plugins>
</build>

<profiles>
  <profile>
    <!-- This profile will be used when running tests without a device -->
    <id>default-profile</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <tests.to.skip>**/*DeviceTest.java</tests.to.skip>
    </properties>
  </profile>

  <profile>
    <id>device-profile</id>
    <activation>
      <property>
        <name>device</name>
        <value>true</value>
      </property>
    </activation>
    <properties>
      <!-- Unsure how to match nothing -->
      <tests.to.skip>NOTHING</tests.to.skip>
    </properties>
  </profile>

これにより2つのプロファイルが作成されます。デフォルトのプロファイルではデバイステストが除外されますが、「device-profile」ではすべてのテストが実行されます。

デバイスプロファイルを実行するには、を実行しますmvn -Ddevice=true test

于 2012-07-24T13:12:51.647 に答える