Maven のビルドでテストをスキップする

Maven を利用する場合、テストをスキップするのは本来であれば推奨されないわけですが、

  • テストに時間がかかりすぎるので普段はテストをスキップしたい
  • スケジュールに追われてテストコードのメンテナンスが追いつかない!けどビルドは通したい…*1

などの事情によりテストをスキップしたい場面に出くわすことがあります。
まれに、"rm -rf src/test/java" というワイルドな手法も見かけるのですが…

テストをスキップするには…

  • テストの実行のみをスキップする
mvn install -DskipTests=true
  • テストコードのコンパイル、およびテストの実行をスキップする
mvn install -Dmaven.test.skip=true

テストをスキップするには上記を使い分けます。
後者の場合、jar:test-jar(org.apache.maven.plugins:maven-jar-plugin:test-jar) もスキップされるようになるため、意図的に *-tests.jar を作成している場合は注意が必要です。
テストコードがコンパイルを通すことすら困難な状況にならない限り*2は、"skipTests" を使用すれば間違いないかと思います。

解説

Maven でテストをスキップする方法に関しては、maven-surefire-plugin のプロジェクト・サイト(英語)に詳しく書かれています。

テストのスキップに関するプラグインの設定項目は2つあり、

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12</version>
        <configuration>
          <skipTests>true</skipTests>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

もしくは

...
        <configuration>
          <skip>true</skip>
        </configuration>
...

となっています*3

プラグインのドキュメントに書いてあるとおり、いずれも Maven Expression に対応しているため、Maven プロパティー、およびシステム・プロパティーを代替として利用することができます。
plugin/configuration に書いてしまうと自由が利きにくくなってしまうため、通常は Maven Expression を使います。

  ...
  <properties>
    <skipTests>true</skipTests>
  </properties>
  ...
  ...
  <properties>
    <maven.test.skip>true</maven.test.skip>
  </properties>
  ...
  • システム・プロパティーを使用する場合
mvn install -DskipTests=true
mvn install -Dmaven.test.skip=true
${skipTests} と ${maven.test.skip} の違い

どちらも、maven-surefire-plugin,maven-failsafe-plugin 単独で見た場合は同じ意味合い(テストの実行をスキップする)となっています。

両者の違いとして、${maven.test.skip} では、

なども同じ Maven Expression で Goal がスキップされるように設計されています。
(他に同様のプラグインがあるかもしれません)

このあたりが「注意が必要」な所以となっています。

ちょっと工夫した使い方 - デフォルトではテストをスキップして必要時のみ実行する

これもmaven-surefire-plugin のプロジェクト・サイト(英語)に書かれている内容です。

pom.xml には

  ...
  <properties>
    <skipTests>true</skipTests>
  </properties>
  ...

と書いておいて、mvn コマンド実行時に必要に応じて

mvn install -DskipTests=false

とします。

普段は意識しなくてもテストをスキップできるようにしておいて、Jenkins などの CI ツールでのビルドや、リリース時だけ意図的にテストを実行するといった使い方が考えられますね。

最後に

最後にもう一度書きますが、この機能は "NOT RECOMMENDED" です。

*1:SI の現場にありがち

*2:SI (デスマーチ)の現場にありがち

*3:integration-test などで使用される mavan-failsafe-plugin も同様の方法でテストがスキップできるようになっています