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