@Before対@BeforeClass対@BeforeEach対@BeforeAll

1前書き

この短いチュートリアルでは、JUnit 4と5の @ Before @ BeforeClass @ BeforeEach 、および @ BeforeAll アノテーションの違いを実際の使用例を使って説明します。

補足的な注釈についても簡単に説明します。

JUnit 4から始めましょう。

2 @前

  • @ Before アノテーションが付けられたメソッドは、各テストの前に実行されます。

リストを初期化していくつかの値を追加する例を見てみましょう。

@RunWith(JUnit4.class)
public class BeforeAndAfterAnnotationsTest {

   //...

    private List<String> list;

    @Before
    public void init() {
        LOG.info("startup");
        list = new ArrayList<>(Arrays.asList("test1", "test2"));
    }

    @After
    public void finalize() {
        LOG.info("finalize");
        list.clear();
    }
}
  • 各テストの実行後にリストを消去するために、 @ After というアノテーションが付けられた別のメソッドも追加したことに注意してください。

その後、リストのサイズを確認するためのテストを追加しましょう。

@Test
public void whenCheckingListSize__thenSizeEqualsToInit() {
    LOG.info("executing test");
    assertEquals(2, list.size());

    list.add("another test");
}

@Test
public void whenCheckingListSizeAgain__thenSizeEqualsToInit() {
    LOG.info("executing another test");
    assertEquals(2, list.size());

    list.add("yet another test");
}

この場合、各テストを実行する前にテスト環境が適切に設定されていることを確認することが重要です。リストはテストの実行ごとに変更されるためです。

ログ出力を見ると、 init finalize メソッドがテストごとに1回実行されたことを確認できます。

... startup
... executing another test
... finalize
... startup
... executing test
... finalize

3 @ BeforeClass

各テストの前に高価な共通操作を実行したい場合は、 @ BeforeClass ** を使用してすべてのテストを実行する前に1回だけ実行するのが望ましいです。一般的な高価な操作の例としては、データベース接続の作成やサーバーの起動があります。

データベース接続の作成をシミュレートする簡単なテストクラスを作成しましょう。

@RunWith(JUnit4.class)
public class BeforeClassAndAfterClassAnnotationsTest {

   //...

    @BeforeClass
    public static void setup() {
        LOG.info("startup - creating DB connection");
    }

    @AfterClass
    public static void tearDown() {
        LOG.info("closing DB connection");
    }
}

これらのメソッドは静的である必要があるので、クラスのテストを実行する前に実行する必要があります。

前と同じように、簡単なテストも追加しましょう。

@Test
public void simpleTest() {
    LOG.info("simple test");
}

@Test
public void anotherSimpleTest() {
    LOG.info("another simple test");
}

今回は、ログ出力を見れば、 setup tearDown メソッドが一度だけ実行されたことを確認できます。

... startup - creating DB connection
... simple test
... another simple test
... closing DB connection

4 @ BeforeEach および @ BeforeAll

  • _ @ BeforeEac hと @ BeforeAll は、JUnit 5の @ Before @ BeforeClass_ ** に相当します。これらの注釈は、混乱を避けるために、より明確な名前に変更されました。

@ BeforeEach および @ AfterEach アノテーションから始めて、これらの新しいアノテーションを使用して以前のクラスを複製しましょう。

@RunWith(JUnitPlatform.class)
class BeforeEachAndAfterEachAnnotationsTest {

   //...

    private List<String> list;

    @BeforeEach
    void init() {
        LOG.info("startup");
        list = new ArrayList<>(Arrays.asList("test1", "test2"));
    }

    @AfterEach
    void finalize() {
        LOG.info("finalize");
        list.clear();
    }

   //...
}

ログを確認すると、 @ Before および @ After アノテーションと同じように動作することを確認できます。

... startup
... executing another test
... finalize
... startup
... executing test
... finalize

最後に、 @ BeforeAll アノテーションと @ AfterAll アノテーションの動作を確認するために、他のテストクラスでも同じようにします。

@RunWith(JUnitPlatform.class)
public class BeforeAllAndAfterAllAnnotationsTest {

   //...

    @BeforeAll
    public static void setup() {
        LOG.info("startup - creating DB connection");
    }

    @AfterAll
    public static void tearDown() {
        LOG.info("closing DB connection");
    }

   //...
}

そして、出力は古いアノテーションと同じです。

... startup - creating DB connection
... simple test
... another simple test
... closing DB connection

5結論

この記事では、JUnitの @ Before @ BeforeClass @ BeforeEach 、および @ BeforeAll アノテーションの違いと、それぞれの使用時期について説明しました。

いつものように、例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5[GitHubで利用可能]です。