Maven2のテストフェーズについてあれこれ

はじめに

Maven2でテストフェーズ(test phase)を実行するといろいろなおまけが付いてきます。今回はこのテストフェーズについて調べてみました。

テストフェーズの実行方法

テストフェーズは、次の5通りの方法で実行することができます。

以下、それぞれの方法についてみていきます。

testフェーズを実行する

テストフェーズは以下のコマンドで明示的に呼び出すことができます。

mvn test

出力イメージはこんな感じです。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building test
[INFO]    task-segment: [test]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [surefire:test]
[INFO] Surefire report directory: C:\Users\xxx\workspace\test\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running test.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 second
[INFO] Finished at: Tue Feb 10 21:50:14 JST 2009
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------

なおpackageやinstallなどのtest以降のフェーズを実行した場合にも、自動的にテストフェーズが呼び出されます。ただ結果表示がテキストだけなのがちょっと残念ですね。

maven-surefire-test-pluginを実行する

maven-surefire-testプラグインは、テストフェーズで呼び出される機能(ゴール)です。この機能を直接呼び出すと、明示的にテストフェーズを呼び出した場合と同じ効果を得ることができます。

maven-surefire-test-pluginを明示的に呼び出すには、次のコマンドを実行します。

mvn surefire:test
maven-surefire-report-pluginを実行する

このプラグインは、テストの実行および集計を行います。ゴールは次の二種類が用意されています。

ゴール名 機能
surefire-report:report(参考) テストの実行フェーズを呼び出し、結果をsiteのレポートとして出力します。
surefire-report:report-only(参考) テスト自体は実行せず、結果をsiteのレポートとして出力します。

なおsurefire-report:reportはテストを実行しますが、これは元々意図された挙動ではなかったため、後にテストの結果表示のみを行いたいユーザーのためにsurefire-report:report-onlyが作られたという経緯があるようです。(参考)

maven-surefire-report-pluginを明示的に呼び出すには、次のコマンドを実行します。

mvn surefire-report:report もしくは mvn surefire-report:report-only
maven-surefire-test-pluginをpom.xmlのbuildに組み込む

上記でテストフェーズが実行された例からも分かるように、maven-surefire-test-pluginは元々ビルドのフェーズとして組み込まれています。これをわざわざpom.xmlのbuildに定義するのは、surefire-test-pluginに何らかの設定を組み込みたい場合だけで良いでしょう。何らかの設定を行う場合は公式サイトの情報を参考にしてください。

maven-surefire-report-pluginをpom.xmlのreportingに組み込む

pom.xmlのreportingにmaven-surefire-report-pluginを組み込むと、siteフェーズが生成するHTMLベースでテスト結果を出力できるようになります。(maven-surefire-test-pluginと違い、デフォルトでは組み込まれていません。)
組み込む定義は以下のようになります。

  <reporting>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-report-plugin</artifactId>
        <version>2.4.2</version>
      </plugin>
      ...
    </plugins>
  </reporting>

この定義をpom.xmlに記述したプロジェクトで以下のコマンドを実行します。

mvn site もしくは mvn surefire-report:report もしくは surefire-report:report-only

target/site以下に生成されるHTMLは以下のようなものです。

非常に見栄えが良いですね。

maven-surefire-report-pluginと連携するプラグイン

Maven2のreportingでは以下のプラグインmaven-surefire-report-pluginと連携します。

これらを使うと、テスト結果はさらに使いやすいものになります。

cobertura-maven-plugin

cobertura-maven-pluginはテストのカバレッジを計測するプラグインです。以下の定義を上述のpom.xmlのreporting/pluginsの下に追加すると、maven-surefire-report-pluginが実行するテストのカバレッジを計測してくれます。

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>cobertura-maven-plugin</artifactId>
  </plugin>

生成されるHTMLは次のようなものです。

maven-jxr-plugin

maven-jxr-pluginは、コードのCross-Reference(相互参照ビュー)を生成するプラグインです。以下の定義をpom.xmlのreporting/pluginsの下に追加すると、src/main/javaおよびsrc/test/javaのCross-Referenceを生成します。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jxr-plugin</artifactId>
</plugin>

これだけでも便利なのですが、さらにsurefire-report-pluginと連携することで、テスト失敗時にFailureDetailsからCross-Referenceにリンクが貼られるようになります。

一番下のリンクをクリックすると・・・

ご覧のようにCrossReferenceにジャンプしてくれます。

その他

テスト組み込み時の注意点

上述の方法でmaven-surefire-test-pluginとmaven-surefire-report-pluginを組み込む場合、一つのpom.xmlに両方を組み込むのは避けた方が無難です。理由は、実行するmavenのフェーズによっては双方が呼ばれてしまい、結果的に一度のビルドで2回テストが実行されることになるからです。もし双方を組み込みたい場合、maven-surefire-report-pluginの方はreport-onlyゴールを実行するなど、設定を工夫する必要があります。

テストのスキップ方法

テストをスキップしたい場合、"-Dmaven.test.skip=true"というオプションを与えてMaven2コマンドを実行します。このオプションが与えられた場合、Maven2はテストを実行するプラグインの呼び出しをスキップします。何らかの理由でテストフェーズをスキップしたい場合に使います。
以下は実行例です。

mvn -Dmaven.test.skip=true package
お勧めの構成

というようにいろいろ見てきましたが、一番良いのはreportingにmaven-surefire-report-pluginとその他のプラグインを組み込むことだと思います。これなら"mvn site"一発でテスト実行〜結果HTML生成までできてしまいます。