Java
 Computer >> コンピューター >  >> プログラミング >> Java

【実例付き】JUnit 5の主要アノテーション徹底解説

JUnit 5は、次世代のJUnitフレームワークです。JVM上での開発者向けテストのための最新の基盤を構築することを目標としており、Java 8以降への対応に加えて、多様なテストスタイルをサポートしています。

MavenとGradleのどちらでも利用できます。

Mavenを使用している場合は、pom.xmlファイルに以下の依存関係を追加してください。

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-params</artifactId>
        <version>5.3.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

JUnit 5の主要アノテーション

JUnit 5における最も分かりやすい変更点のひとつは、テストクラスやテストメソッドがpublicである必要がなくなったことです。

それでは、最もよく使われるJUnit 5アノテーションを順番に見ていきましょう。

@Test

このアノテーションは、対象のメソッドがテストメソッドであることを示します。なお、このアノテーションは属性を持ちません。

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

class JUnit5Test {
        
    @Test
    void helloJUnit5() {
        assertEquals(10, 5+5);
    }
}

@ParameterizedTest

パラメータ化テストを使うと、異なる引数を渡して同じテストを複数回実行できます。宣言方法は通常の@Testメソッドと同じですが、代わりに@ParameterizedTestアノテーションを使用します。

さらに、各呼び出しに対して引数を供給するソースを少なくとも1つ宣言し、テストメソッド内でその引数を受け取る必要があります。

例えば、以下の例では@ValueSourceアノテーションを使って文字列配列を引数のソースとして指定したパラメータ化テストを示しています。

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import static org.junit.jupiter.api.Assertions.assertTrue;

class JUnit5Test {

    @ParameterizedTest
    @ValueSource(strings = { "cali", "bali", "dani" })
    void endsWithI(String str) {
        assertTrue(str.endsWith("i"));
    }
}

@RepeatedTest

JUnit 5では、メソッドに@RepeatedTestを付けて繰り返し回数を指定するだけで、テストを指定した回数だけ繰り返し実行できます。

繰り返しテストの各呼び出しは、通常の@Testメソッドの実行と同じように動作します。

これは特に、Seleniumを使ったUIテストにおいて非常に役立ちます。

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;
import org.junit.jupiter.api.TestInfo;

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

class JUnit5Test {
    
    @RepeatedTest(value = 5, name = "{displayName} {currentRepetition}/{totalRepetitions}")
    @DisplayName("RepeatingTest")
    void customDisplayName(RepetitionInfo repInfo, TestInfo testInfo) {
        int i = 3;
        System.out.println(testInfo.getDisplayName() + 
            "-->" + repInfo.getCurrentRepetition()
        );
        
        assertEquals(repInfo.getCurrentRepetition(), i);
    }
}

【実例付き】JUnit 5の主要アノテーション徹底解説

テスト結果からも分かるように、i==3の場合はテストが成功し、それ以外の場合は失敗します。

@DisplayName

テストクラスやテストメソッドにはカスタム表示名を宣言でき、テストランナーやテストレポートにその名前が表示されます。

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;

@DisplayName("DisplayName Demo")
class JUnit5Test {
    @Test
    @DisplayName("Custom test name")
    void testWithDisplayName() {
    }

    @Test
    @DisplayName("Print test name")
    void printDisplayName(TestInfo testInfo) {
        System.out.println(testInfo.getDisplayName());
    }
}

@BeforeEach

@BeforeEachアノテーションは、付与されたメソッドが各テストメソッドの前に実行されることを示します。JUnit 4の@Beforeに相当します。

import org.junit.jupiter.api.*;

class JUnit5Test {
    @BeforeEach
    void init(TestInfo testInfo) {
        String callingTest = testInfo.getTestMethod().get().getName();
        System.out.println(callingTest);
    }

    @Test
    void firstTest() {
        System.out.println(1);
    }

    @Test
    void secondTest() {
        System.out.println(2);
    }
}

出力結果:

firstTest
1
secondTest
2

@AfterEach

このアノテーションは、付与されたメソッドが各テストメソッドの後に実行されることを示します。JUnit 4の@Afterに相当します。例えば、各テストの後にプロパティをリセットする必要がある場合、その処理を行うメソッドに@AfterEachを付けます。

import org.junit.jupiter.api.*;

class JUnit5Test {

    @Test
    void firstTest() {
        System.out.println(1);
    }
    @Test
    void secondTest() {
        System.out.println(2);
    }

    @AfterEach
    void after(TestInfo testInfo) {
        String callingTest = testInfo.getTestMethod().get().getName();
        System.out.println(callingTest);
    }
}

出力結果:

1
firstTest
2
secondTest

@BeforeAll

このアノテーションは、すべてのテストの前に1度だけメソッドを実行します。JUnit 4の@BeforeClassに相当します。@BeforeAllは通常、テストに必要な各種初期化処理に使用されます。

import org.junit.jupiter.api.*;

class JUnit5Test {

    @BeforeAll
    static void init() {
        System.out.println("Only run once before all tests");
    }

    @Test
    void firstTest() {
        System.out.println(1);
    }
    @Test
    void secondTest() {
        System.out.println(2);
    }
}

出力結果:

Only run once before all tests
1
2

@AfterAll

@AfterAllアノテーションは、すべてのテストが完了した後にのみメソッドを実行するために使用します。JUnit 4の@AfterClassに相当します。このアノテーションは、全テスト終了時の後片付けやプロセスの終了処理に活用されます。

import org.junit.jupiter.api.*;

class JUnit5Test {

    @Test
    void firstTest() {
        System.out.println(1);
    }
    @Test
    void secondTest() {
        System.out.println(2);
    }

    @AfterAll
    static void after() {
        System.out.println("Only run once after all tests");
    }
}

出力結果:

1
2
Only run once after all tests

@Tag

このアノテーションを使うと、クラスレベルまたはメソッドレベルでテストをフィルタリングするためのタグを宣言できます。

@Tagアノテーションは、特定のテストだけを選んでテストスイートを作成したい場合に便利です。

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("smoke")
class JUnit5Test {

    @Test
    @Tag("login")
    void validLoginTest() {
    }

    @Test
    @Tag("search")
    void searchTest() {
    }
}

@Disabled

@Disabledアノテーションは、クラスレベルまたはメソッドレベルでテストを無効化(スキップ)するために使用します。JUnit 4の@Ignoreに相当します。

クラスレベルで宣言した場合は、そのクラス内のすべての@Testメソッドがスキップされます。一方、メソッドレベルで@Disabledを使用した場合は、付与されたメソッドのみが無効化されます。

例:@Disabledでテストクラス全体を無効化する場合:

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

@Disabled
class DisabledClassDemo {

    @Test
    void testWillBeSkipped() {
    }
}

例:@Disabledで個別のテストメソッドを無効化する場合:

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

class DisabledTestsDemo {

    @Disabled
    @Test
    void testWillBeSkipped() {
    }

    @Test
    void testWillBeExecuted() {
    }
}
  1. Linuxのfindコマンド徹底解説!基本構文から実践的な使用例まで

    新規インストール直後のLinuxには、どれくらいのファイルが含まれているかご存知ですか?Pop!_OSを例に挙げると、なんと31,000個以上のファイルが存在します。これはドキュメントの作成や音楽の保存、PDFのダウンロード、写真の整理などを始める前の話です。そのため、必要なファイルやフォルダを必要なときに素早く見つけるのは、意外と難しい作業になります。この記事では、Linuxのfindコマンドの使い方を、実用的なコマンド例とともに詳しく解説していきます。findコマンドの基本構文構文とは、単語やコマンドの組み合わせ方のことです。普通の文章でも語順を入れ替えると意味不明になるように、コマンドも

  2. 【初心者向け】JavaのArrayListメソッド完全ガイド|コード例つきで解説

    この記事では、JavaのArrayListでよく使われる主要なメソッドを、実行結果つきのコード例とともにわかりやすく解説します。 ArrayListクラスは、サイズを自由に変更できる「可変長配列」です。リストの要素数が事前にわからない場合に特に便利で、Javaの開発現場で最も広く使われているコレクションの一つです。 ArrayListクラスは、java.utilパッケージに含まれています。 ArrayListの作成方法 ArrayListを作成して要素を追加するには、StringやIntegerなど扱いたい型を指定してArrayListオブジェクトをインスタンス化します。 なお、add()メソ