1概要

JUnitはJavaで最も人気のある単体テストフレームワークの1つなので、新しいメジャーバージョンが登場したとき、それは開発者コミュニティでは大したことです。 JUnit 5のアルファ版は2月上旬にリリースされました。そして、それは多くの刺激的な革新を含みます。

この記事では、このリリースの新機能、および以前のバージョンとの主な違いについて説明します。


2依存関係とセットアップ

JUnit 5のインストールはとても簡単です。

pom.xml

に次の依存関係を追加するだけです。

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

ただし、現時点ではまだIDEがJUnit 5をサポートしていないため、ビルドスクリプトも指定する必要があります。

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <dependencies>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.0.2</version>
        </dependency>
    </dependencies>
</plugin>

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

テストを作成するときは、必ず

org.junit.jupiter.api.Test

をインポートしてください。


3新着情報

JUnit 5は、Java 8の新機能、特にラムダ式を最大限に活用しようとしています。


3.1. アサーション

アサーションは

org.junit.jupiter.api.Assertions

に移動され、大幅に改善されました。前述のように、アサーションでラムダを使用できるようになりました。

@Test
void lambdaExpressions() {
    assertTrue(Stream.of(1, 2, 3)
      .stream()
      .mapToInt(i -> i)
      .sum() > 5, () -> "Sum should be greater than 5");
}

上記の例は簡単ですが、アサーションメッセージにラムダ式を使用する利点の1つは、遅延式で評価されることです。メッセージの構成が高価な場合は、時間とリソースを節約できます。

アサーションを

assertAll()

でグループ化することも可能になりました。これは

MultipleFailuresError

を使用してグループ内の失敗したアサーションを報告します。

 @Test
 void groupAssertions() {
     int[]numbers = {0, 1, 2, 3, 4};
     assertAll("numbers",
         () -> assertEquals(numbers[0], 1),
         () -> assertEquals(numbers[3], 3),
         () -> assertEquals(numbers[4], 1)
     );
 }

これは、失敗の正確な場所を正確に特定できるようになるため、より複雑なアサーションを行うことがより安全になることを意味します。


3.2. 仮定

前提条件は、特定の条件が満たされた場合にのみテストを実行するために使用されます。

これは通常、テストを正しく実行するために必要な外部条件に使用されますが、テスト対象とは直接関係しません。


assumeTrue()



assumeFalse()

、および__assumingThat()を使用して仮定を宣言できます。

@Test
void trueAssumption() {
    assumeTrue(5 > 1);
    assertEquals(5 + 2, 7);
}

@Test
void falseAssumption() {
    assumeFalse(5 < 1);
    assertEquals(5 + 2, 7);
}

@Test
void assumptionThat() {
    String someString = "Just a string";
    assumingThat(
        someString.equals("Just a string"),
        () -> assertEquals(2 + 2, 4)
    );
}

仮定が失敗すると、

TestAbortedException

がスローされ、テストは単にスキップされます。

仮定はラムダ式も理解します。


3.3. 例外

JUnit 5は例外のサポートを改善します。式が特定の型の式をスローすることを確認する

assertThrows()

メソッドが追加されました。

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

例が示すように、JUnit 5は、JUnit 4が使用していたものよりも、スローされた例外をより細かく制御できます。最も明白な意味は、この例では例外メッセージを調べることで行ったように、例外について必要な情報を簡単に取得できることです。


3.4. 入れ子になったテスト

開発者がテストの異なるグループ間の複雑な関係を表現できるようにするためにネストされたテストが追加されました。構文は非常に簡単です – あなたがしなければならないのは

@Nested.

で内部クラスに注釈を付けることだけです

JUnitのドキュメントには、http://junit.org/junit5/docs/current/user-guide/#nested-tests[example]という詳細な説明があります。


3.5. テストを無効にする

テストは

@ Disabled

アノテーションで無効にできるようになりました。

@Test
@Disabled
void disabledTest() {
    assertTrue(false);
}

このテストは実行されません。

@ Disabled

アノテーションはテストケースまたはテストメソッドのどちらにも適用でき、JUnit 4の

@ Ignore

と同じです。


3.6. タグ付け

タグはJUnit 4の

Categories

に代わるものです。タグは

@ Tag

アノテーションで適用できます。これらにより、開発者はテストをグループ化してフィルタ処理することができます。

@Tag("Test case")
public class TaggedTest {

    @Test
    @Tag("Method")
    void testMethod() {
        assertEquals(2+2, 4);
    }
}


4結論

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

これを書いている時点ではAlphaビルドのみが利用可能であったことに注意することは重要です、それでいくつかの事柄はまだリリース前に変更されるかもしれません。

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