maven-surefire-plugin についての覚え書き

とりあえず maven-surefire-plugin のバージョンが 4.5-SNAPSHOT で、かつ fork=once と、junitを使用している場合だけ調査

maven surefire プラグインのソース構造

このエントリで必要なもののみを記述

surefire
├mavne-surefire-plugin
│└SurefirePlugin
├maven-surefire-booter
│└SurefireBooter
├maven-surefire-api
│└Surefiremaven-providers
 ├surefire-junit
 │├JUnitDirectoryTestDuite.java
 │└JUnitTestSet
 ├surefire-junit4
 │├JUnit4DirectoryTestDuite.java
 │└JUnit4TestSet
 └surefire-testng

maven surefire プラグインの動作順番

フォークする前処理
  1. SurefirePlugin でpom中の各種設定値を取得
  2. SurefireBooter の各種フィールドに上記の値を設定
  3. テンポラリフォルダに surefirebooter*.jar というファイルを作成する。この中身はMANIFEST.MFのみ。
    • MANIFEST.MFの中身は クラスパス設定と、SurefireBooterをMain-Classとすることが書いてある
    • クラスパス設定は下記の順で追加される
      1. (※${project.testClasspathElements}が使用される。read only指定のため差し替え不可?)
      2. 指定があった場合:${project.build.outputDirectory}の替わりに
      3. 指定があった場合:${project.build.testClassesDirectory}の替わりに
    • このため、dependenciesとaddClasspathElements中に同じクラスが存在すると、dependenciesの方が勝ちます
  4. テンポラリフォルダに surefire*tmp というファイルを作成する。この中身は各種プロパティが設定されている。プロパティはフォーク前の各種OSやJavaのプロパティ値など
フォーク
  1. コマンドラインから javaコマンドを使用して先ほどのsurefirebooter*.jarを実行
  2. 各種プロパティをsurefire*tmpからロード
  3. SurefireBooterからSurefire#runを実行
Surefireでのテストクラスのロード処理
  1. ベースディレクトリとしてtestClassesDirectoryを用い、そこからディレクトリを辿っての対象となっているクラスをリストにする
    • ※ディレクトリ探索クラスはdependenciesの記述により下記のように変更されます
      • testNGもしくはtestNGArtifactNameがある場合:TestNGDirectoryTestSuite
      • maven-junit-plugin のバージョンが4から始まる場合:JUnit4DirectoryTestSuite
      • その他の場合:JUnitDirectoryTestSuite
  2. この段階でテストクラスファイルが見つからない場合処理終了。
  3. クラスファイルが見つかった場合、リストからテストメソッドを集める
    1. junit及びjunit4の場合、テストメソッドのかき集め方は下記の通り
      • リスト中のクラスがTest派生の場合は通常通り
      • リスト中のクラスがTest派生では無い場合、そのクラス中のstaticではなく、returnTypeがvoidで、かつメソッド名の最初4文字が"test"のメソッドがテストメソッドとしてロードされる。
    2. suite() の扱い
      • suite() を含むがTestクラス派生でない場合maven-junit-pluginのを4から始めておけば集めてくれる。3の場合は駄目
      • suite() を含むクラスがTest派生の場合はバージョンが4以降でなくてもsuiteメソッドが使用される。
テスト実行
  1. JUnitRunnerを使用して先ほど集めたテスト群をテスト実行