• 2019年5月20日月曜日
アリスト戦記
アリスト戦記 https://blog.aristo-solutions.net/2019/05/junit5beforeallafterallbeforeeachaftere.html

JUnit5のアノテーション「@BeforeAll」「@AfterAll」「@BeforeEach」「@AfterEach」

前回に引き続き、JUnit5の勉強を進めていくぜ。

まずは基本である「@BeforeAll」「@AfterAll」「@BeforeEach」「@AfterEach」だ。

「@BeforeAll」「@AfterAll」「@BeforeEach」「@AfterEach」

この4つのアノテーションはユニットテストのテクニックの伝統的技法で昔からあるものだ。
ただし、書き方はJUnit4以前と変わっているので、以下で覚えなおしておく。

アノテーション 意味
@BeforeAll 全てのテストの最初に一回だけ実行する。
@AfterAll 全てのテストの最後に一回だけじっこうする。
@BeforeEach 書くテストの前に毎回実行する。
@AfterEach 書くテストの後に毎回実行する。

使い分けのコツ

ユニットテストでは、基本的にテストメソッド毎に独立していることが望ましい。

「このメソッドは単品では動くけど、別のメソッドを動かした後だと動かなくなる」とかそういう状態にならないようにすることは必須だ。

従って、テストの結果として残留するファイルとか、データベースとか、そういうものは毎回クリア。
つまり、「@BeforeEach」「@AfterEach」で毎回初期化するのが本来望ましい。

しかし、「@BeforeEach」「@AfterEach」を毎回実行するということは、それだけJUnitが重くなっていくということだ。
酷くなるとJUnitを一回実行するのに何十分、何時間も掛かるようになってしまう。これをスローテスト問題と言う。

そこで、余りに重い場合は、仕方無いからポリシーを曲げて、「@BeforeAll」「@AfterAll」で一回だけ実行することで、少しでも処理速度を早くしよう、とそういう使い分けだ。

だから、基本的には「@BeforeEach」「@AfterEach」を使用し、チューニングの必要がある時だけ「@BeforeEach」「@AfterEach」を解禁するという風に理解していくと良い。

サンプル

サンプルソース

public class JUnit5Test {

   @BeforeAll
   public static void beforeAll() {

      System.out.println("最初の一回だけ実行される。");

   }

   @AfterAll
   public static void afterAll() {

      System.out.println("最後の一回だけ実行される。");

   }

   @BeforeEach
   public void beforeEach() {

      System.out.println("各テストの前に毎回呼ばれる。");

   }

   @AfterEach
   public void afterEach() {

      System.out.println("各テストの後に毎回呼ばれる。");

   }

   @Test
   public void myTest1() {

      System.out.println("テストその1");

      assertEquals(2, 1 + 1);
   }

   @Test
   public void myTest2() {

      System.out.println("テストその2");

      assertEquals(2, 1 + 1);
   }

}

結果

最初の一回だけ実行される。
各テストの前に毎回呼ばれる。
テストその1
各テストの後に毎回呼ばれる。
各テストの前に毎回呼ばれる。
テストその2
各テストの後に毎回呼ばれる。
最後の一回だけ実行される。


終わりに

JUnit5と言えども、基本は昔から変わっていない。
Junit4の経験者であれば問題無く理解出来そうだ。

0 件のコメント:

コメントを投稿