GradleでJUnit 5を使う

GradleでJUnit 5を使用する

1. 概要

このチュートリアルでは、Gradleビルドツールを使用して、新しいJUnit5プラットフォームでテストを実行します。

古いバージョンと新しいバージョンの両方をサポートするプロジェクトを構成します。

新しいバージョンの詳細については、A Guide to JUnit 5をお読みください。 または、ビルドツールに関する詳細情報のIntroduction to Gradle

2. Gradleセットアップ

まず、バージョン4.6以降のビルドツールがインストールされているかどうかを確認します。これは、バージョン4.6以降がJUnit5で動作する最も古いバージョンであるためです。

最も簡単な方法は、gradle -vコマンドを実行することです。

$> gradle -v
------------------------------------------------------------
Gradle 4.10.2
------------------------------------------------------------

また、必要に応じて、installationの手順に従って適切なバージョンを取得できます。

すべてをインストールしたら、build.gradleファイルを使用してGradleを構成する必要があります。

ビルドツールに単体テストプラットフォームを提供することから開始できます。

test {
    useJUnitPlatform()
}

プラットフォームを指定したので、JUnitの依存関係を指定する必要があります。 ここで、JUnit 5と以前のバージョンの間に注目すべき違いが見られます。

以前のバージョンでは、必要な依存関係は1つだけでした。 In JUnit 5, though, the API is separated from the runtime, meaning two dependencies.

APIは、junit-jupiter-apiで明示されます。 ランタイムは、JUnit 5の場合はjunit-jupiter-engine、JUnit 3または4の場合はjunit-vintage-engineです。

これら2つをそれぞれtestImplementation timeRuntimeOnlyで提供します。

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}

3. テストの作成

最初のテストを書いてみましょう。 以前のバージョンと同じように見えます。

@Test
public void testAdd() {
    assertEquals(42, Integer.sum(19, 23));
}

さて、we can run the test by executing the gradle clean test command

JUnit 5を使用していることを確認するために、インポートを確認できます。 The imports for @Test and assertEquals should have a package starting with org.junit.jupiter.api:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

そのため、最後の例では、長年にわたって機能している「古い」機能を備えたテストを作成しました。 次に、JUnit5の新機能のいくつかを使用する別の例を作成します。

@Test
public void testDivide() {
    assertThrows(ArithmeticException.class, () -> {
        Integer.divideUnsigned(42, 0);
    });
}

assertThrowsは、@Test(expected=ArithmeticException.class).の古いスタイルを置き換えるJUnit5の新しいアサーションです。

4. Gradleを使用したJUnit5テストの構成

次に、GradleとJUnit5のより深い統合について説明します。

スイートには、長期実行と短期実行の2種類のテストがあるとします。 JUnit 5@Tag annotationを使用できます。

public class CalculatorJUnit5Test {
    @Tag("slow")
    @Test
    public void testAddMaxInteger() {
        assertEquals(2147483646, Integer.sum(2147183646, 300000));
    }

    @Tag("fast")
    @Test
    public void testDivide() {
        assertThrows(ArithmeticException.class, () -> {
            Integer.divideUnsigned(42, 0);
        });
    }
}

Then, we tell the build tool which ones to execute.この場合、短期間の(高速)テストを実行してみましょう。

test {
    useJUnitPlatform {
        includeTags 'fast'
        excludeTags 'slow'
    }
}

5. 古いバージョンのサポートを有効にする

Now, it’s still possible to create JUnit 3 and 4 tests with the new Jupiter engine.さらに、同じプロジェクトで、たとえば移行シナリオで、それらを新しいバージョンと混在させることができます。

まず、既存のビルド構成にいくつかの依存関係を追加します。

testCompileOnly 'junit:junit:4.12'
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.3.1'

プロジェクトにjunit-jupiter-engine junit-vintage-engine.の両方が含まれていることに注意してください

次に、新しいクラスを作成し、前に作成したtestDivideメソッドをコピーして貼り付けます。 次に、@TestassertEqualsのインポートを追加します。 ただし、今回は、org.junit:で始まる古いバージョン4パッケージを使用するようにします。

import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class CalculatorJUnit4Test {
    @Test
    public void testAdd() {
        assertEquals(42, Integer.sum(19, 23));
    }
}

6. 結論

このチュートリアルでは、GradleとJUnit 5を統合しました。 さらに、バージョン3および4のサポートも追加しました。

ビルドツールは、新旧のバージョンに対して優れたサポートを提供することを確認しました。 したがって、既存のテストをすべて変更することなく、既存のプロジェクトで新しい機能を使用できます。

完全なコード例は、GitHub projectにあります。 自分のプロジェクトの出発点として自由に使用してください。