JUnit5でテストクラスの実行順を指定する
こんにちは。自動化エンジニアのtmshftです。
本日はJUnit5でテストクラスの実行順を指定するショートTipsをお送りします。
実行環境
・Java: AdoptOpen JDK11.x
・JUnit: 5.6.x
・gradle:6.7
メソッドの実行順を指定する
E2E自動テストを書いていると、テストの実行順を指定したい場合があります。(本来は色々な意味でやるべきではないのですが)
同一クラス内のテストメソッドの実行順はJUnit5でもサポートされており、アルファベット順や明示的な指定など柔軟かつシンプルに書くことができます。
TestMethodOrder (JUnit 5.7.0 API)
テストクラスの実行順を指定する
例えばこんなユースケースです
JUnitではpackage順にテストクラスが実行されますので、順番に並ぶようにクラスの命名規約を守れば良いだけなのですが、ときによっては実行パターンを幾つか持たせたい場合もあります。
・実行パターン1: クラス01 ⇒ クラス02 ⇒ クラス03
・実行パターン2: クラス01 ⇒ クラス02 ⇒ クラス04 ⇒ クラス03
このような場合は明示的に順を指定してやる必要があります。
JUnit4ではTestSuiteを用いて簡潔に書くことができました。
@RunWith(Suite.class)
@Suite.SuiteClasses({
mypackage.serialize.ExampleTest.class, // テストクラスを実行順に列挙する
mypackage.admin.ExampleTest2.class,
mypackage.admin.ExampleTest3.class,
...
mypackage.admin.ExampleTestN.class,
})
ところがJUnit5ではTestSuiteが廃止されたため、このようにサッと書くことができません。@ExtendWithを用いたり、動的にテストを生成する方法も考えたのですが、もっとシンプルに実装する方法がないかと思案したところ、テストクラスをExtendsして子クラスとしてまとめてやればできそうでした。
// 順番を指定して一括実行する親クラス
public class ClassOrderTest {
static class _001 extends ExampleTest {
}
static class _002 extends ExampleTest2 {
}
static class _003 extends ExampleTest4 {
}
static class _004 extends ExampleTest3 {
}
...
static class _NNN extends ExampleTestN {
}
}
実行は、子クラスをワイルドカードでgradleのTestタスクに渡してやります。
> gradlew clean test --tests ClassOrderTest$*
これだけで順番どおりに実行できました。
レポートに出力されるテストクラス名がExtendsしたクラス名に変わってしまうのが課題ですね。
まとめ
テストフレームワークであるJUnitは、本来GUIテスト向けのフレームワークとしては設計されていないものの、複雑化するGUI自動テストをサポートしてくれる便利な拡張APIが幾つかあります。
これらを使いこなしてGUIテストを効果的に設計していきたいところではありますが、あまり現場独自に拡張してしまうと、属人性や汎用性の面の心配が出てきます。
このあたりはバランスをよく考え、シンプルさを大切にして、初見のエンジニアにも優しいツール設計を心がけるのが、ベスト・プラクティスになるのでは?と思いました。
現場からは以上です。
それでは、みなさんHappy Test Journey!!
__________________________________
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/