見出し画像

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,
       })

参考: RunWith (JUnit API)

ところが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!!

__________________________________

執筆者プロフィール:森川 知雄
中堅SIerでテスト管理と業務ツール、テスト自動化ツール開発を12年経験。
SHIFTでは、GUIテストの自動化ツールRacine(ラシーヌ)の開発を担当。
GUIテストに限らず、なんでも自動化することを好むが、
ルンバが掃除しているところを眺めるのは好まないタイプ。
さまざま案件で自動化、効率化による顧客への価値創出を日々模索している。

お問合せはお気軽に
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/