JUnit 5のガイド

1概要

JUnit は、Javaエコシステムで最も人気のある単体テストフレームワークの1つです。現在の安定版はJUnit 4.12ですが、5.1.0版には、さまざまなスタイルのテストを可能にするだけでなく、Java 8以降の新機能をサポートすることを目的とした、数多くのエキサイティングな革新が含まれています。

この記事はリンクのフォローアップです:/junit-5-preview[preview of JUnit 5]

2 Mavenの依存関係

JUnit 5.x.0 の設定は非常に簡単です。次の依存関係を pomに追加する必要があります。 xml :

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.1.0</version>
    <scope>test</scope>
</dependency>

このバージョンが動作するにはJava 8が必要であることに注意することが重要です。

さらに、EclipseのJUnitプラットフォームとIntelliJで単体テストを実行することが直接サポートされるようになりました。もちろん、Maven Testゴールを使ってテストを実行することもできます。

一方、IntelliJはデフォルトでJUnit 5をサポートしています。そのため、IntelliJでJUnit 5を実行するのは非常に簡単です。単に右クリック - >実行、またはCtrl-Shift-F10を押すだけです。

3建築

JUnit 5は、3つの異なるサブプロジェクトからのいくつかの異なるモジュールで構成されています。

3.1. JUnitプラットフォーム

プラットフォームはJVM上でテストフレームワークを起動する責任があります。

JUnitとそのクライアント(ビルドツールなど)の間の安定した強力なインターフェースを定義します。

最後の目的は、テストの発見と実行において、クライアントがどのようにしてJUnitと簡単に統合できるかです。

JUnitプラットフォーム上で動作するテストフレームワークを開発するためのhttp://junit.org/junit5/docs/current/api/org/junit/platform/engine/TestEngine.html[TestEngine]APIも定義されています。

それにより、カスタムのTestEngineを実装することで、サードパーティのテストライブラリを直接JUnitにプラグインできます。

3.2. JUnitジュピター

このモジュールには、JUnit 5でテストを書くための新しいプログラミングおよび拡張モデルが含まれています。JUnit4と比較した新しい注釈は次のとおりです。

  • @ TestFactory - 動的テストファクトリであるメソッドを表します

テスト ** @ DisplayName - テストクラスのカスタム表示名または

試験方法 ** @ Nested - 注釈付きクラスがネストされた非静的クラスであることを示します

テストクラス ** @ Tag - フィルタテスト用のタグを宣言する

  • @ ExtendWith - カスタム拡張を登録するために使用されます

  • @ BeforeEach – は、注釈付きメソッドが実行されることを示します。

各テストメソッドの前(以前は @ Before ) ** @ AfterEach - 注釈付きメソッドが実行されることを示します

各テストメソッドの後(以前は @ After ) ** @ BeforeAll - 注釈付きメソッドが実行されることを示します

現在のクラスのすべてのテストメソッドの前(以前の @ BeforeClass ) ** @ AfterAll - アノテーション付きメソッドが後に実行されることを示します

現在のクラスのすべてのテストメソッド(以前は @ AfterClass ) ** @ Disable - テストクラスまたはメソッドを無効にするために使用されます(以前は

@無視

3.3. JUnit Vintage

JUnit 5プラットフォームでのJUnit 3およびJUnit 4ベースのテストの実行をサポートします。

4基本アノテーション

新しいアノテーションを議論するために、セクションを実行の責任を負う以下のグループに分けました:テストの前、テストの間(オプション)そしてテストの後:

4.1. @ BeforeAll および @ BeforeEach

以下は、主なテストケースの前に実行される簡単なコードの例です。

@BeforeAll
static void setup() {
    log.info("@BeforeAll - executes once before all test methods in this class");
}

@BeforeEach
void init() {
    log.info("@BeforeEach - executes before each test method in this class");
}

注意すべき重要な点は、 @ BeforeAll アノテーションを持つメソッドは静的である必要があり、そうでなければコードがコンパイルされないことです。

4.2. @ DisplayName および @ Disabled

テストオプションの新しい方法に移行しましょう。

@DisplayName("Single test successful")
@Test
void testSingleSuccessTest() {
    log.info("Success");
}

@Test
@Disabled("Not implemented yet")
void testShowSomething() {
}

ご覧のとおり、新しいアノテーションを使用して、表示名を変更したり、コメント付きのメソッドを無効にしたりできます。

4.3. @ AfterEach @ AfterAll

最後に、テスト実行後の操作​​に関連するメソッドについて説明しましょう。

@AfterEach
void tearDown() {
    log.info("@AfterEach - executed after each test method.");
}

@AfterAll
static void done() {
    log.info("@AfterAll - executed after all test methods.");
}

@ AfterAll を持つメソッドも静的メソッドである必要があることに注意してください。

5アサーションと仮定

JUnit5の/junit-5-preview[チュートリアル]を参照してください。

6. 例外テスト

JUnit 5には2つの例外テスト方法があります。どちらも assertThrows() メソッドを使用して実装できます。

@Test
void shouldThrowException() {
    Throwable exception = assertThrows(UnsupportedOperationException.class, () -> {
      throw new UnsupportedOperationException("Not supported");
    });
    assertEquals(exception.getMessage(), "Not supported");
}

@Test
void assertThrowsException() {
    String str = null;
    assertThrows(IllegalArgumentException.class, () -> {
      Integer.valueOf(str);
    });
}

最初の例は、スローされた例外の詳細を検証するために使用され、2番目の例は単に例外の種類を検証します。

7. テストスイート

JUnit 5の新機能を継続するために、テストスイート内で複数のテストクラスを集約してそれらを一緒に実行できるようにするという概念を理解しようとします。 JUnit 5には2つの注釈があります。

テストスイートを作成するには、 @ SelectPackages および @ SelectClasses

この初期段階では、ほとんどのIDEがこれらの機能をサポートしていないことに注意してください。

最初のものを見てみましょう。

@RunWith(JUnitPlatform.class)
@SelectPackages("com.baeldung")
public class AllTests {}

テストスイートを実行するときに選択されるパッケージの名前を指定するために @ SelectPackage が使用されます。この例では、すべてのテストを実行します。 2番目のアノテーション @ SelectClasses は、テストスイートを実行するときに選択するクラスを指定するために使用されます。

@RunWith(JUnitPlatform.class)
@SelectClasses({AssertionTest.class, AssumptionTest.class, ExceptionTest.class})
public class AllTests {}

たとえば、上記のクラスは3つのテストクラスを含むスイートを作成します。クラスは1つのパッケージにまとめられる必要はありません。

8動的テスト

最後に取り上げるトピックはJUnit 5の動的テスト機能です。これにより、実行時に生成されたテストケースを宣言して実行できます。コンパイル時に固定数のテストケースを定義する静的テストとは対照的に、動的テストではランタイムでテストケースを動的に定義できます。

動的テストは、__@TestFactoryというアノテーションを付けたファクトリメソッドによって生成できます。コードの例を見てみましょう。

@TestFactory
public Stream<DynamicTest> translateDynamicTestsFromStream() {
    return in.stream()
      .map(word ->
          DynamicTest.dynamicTest("Test translate " + word, () -> {
            int id = in.indexOf(word);
            assertEquals(out.get(id), translate(word));
          })
    );
}

この例は非常に簡単で理解しやすいものです。それぞれ in out という名前の2つの ArrayList を使用して単語を翻訳したいと思います。ファクトリメソッドは Stream Collection Iterable 、または Iterator を返す必要があります。今回の場合は、Java 8 Stream. を選択します。

@ TestFactory メソッドはプライベートまたは静的にしないでください。

テストの数は動的であり、それは ArrayList サイズによって異なります。

9結論

この記事は、JUnit 5に伴う変更点の概要です。

JUnit 5は、プラットフォームランチャー、ビルドツール、IDE、他の単体テストフレームワークなどとの統合に関連して、アーキテクチャが大きく変更されています。 。

この記事で使われている例はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5[GitHubプロジェクト]にあります。