JUnit 5は、開発者がコードの単体テストを行うために使用するソフトウェアテストフレームワークです。これはJavaベースのフレームワークで、Javaプラットフォーム上でテストを作成および実行することができ、テスト結果を表示する統合レポーターも含まれています。
JUnitは、自動化テストのために主に2つの目的で使用できます:
- ソフトウェアが期待通りに機能していることを確認すること
- コード内のエラーを見つけて報告し、できるだけ早く修正すること
このブログでは、JUnit 5のセットアップ、構成、および基本的なメソッドについて学んでいきます。
JUnit 5とは?
JUnit 5は、JUnitテストフレームワークの最新バージョンです。これはJava 8以降の新しいバージョンをサポートし、さまざまなテストスタイルに対応し、JVM上での開発者側のテストのための現代的な基盤を提供します。
JUnitを使用する主な利点は、そのモジュール性です。これは、開発者がソフトウェアのさまざまなコンポーネントを簡単にテストできる複数のモジュールを含んでいます。また、アプリケーション全体ではなく、アプリケーションの個々のクラスをテストするためにも使用できます。
JUnit 5の特徴
以下は、JUnit 5の人気のある重要な特徴のいくつかであり、他の単体テストフレームワークと区別される点です。
Feature | Description | Annotations/Method |
---|---|---|
テストスイート |
テストスイートは基本的に、スモークテスト、サニティテスト、または特定の機能に関連するテストのグループです。 JUnit 5は、一緒に実行できるテストスイートの作成を許可します。 |
テストスイートを使用するには、JUnit Platform Suiteの依存関係を追加し、次のアノテーションを使用する必要があります。@SelectPackages ,@SelectClasses , @Suite |
アサーション | アサーションは、ソフトウェアの期待される動作を検証するために使用されます。JUnit 5は、アサーションを簡単に実行するための組み込みアサーションメソッドを提供しています。 | クラスimport org.junit.jupiter.api.Assertions; には、複数のアサーションメソッドが用意されています。いくつかのメソッドは以下の通りです: assertTrue() , assertFalse() ,assertEquals() , assertAll() , assertNotEquals() |
テスト実行順序 | テストの実行順序をカスタマイズします。これにより、開発者はテスト実行を制御し、必要に応じて特定の順序でテストを実行できます。 | @TestMethodOrder , @Order ,@TestClassOrder |
例外テスト | 必要な例外がテストに投げられていることを検証する例外テストを実行します。 | import org.junit.jupiter.api.Assertions; クラスから以下のメソッドが使用されます: assertThrows() |
テスト依存関係 | テスト依存関係は、テストメソッドがお互いに依存することで、順次テストを可能にします。つまり、前のテストメソッドに依存する次のテストメソッドは、前のテストが合格しない限り実行されません。これは統合テストを書く際に役立つ機能です。 | @TestInstance |
テストの無効化 | テストまたはテストクラスを無効にします。 | @Disabled |
タイムアウト | 指定された時間を超過するとテストを失敗させます。 | @Timeout |
レポート | テスト結果を分析し詳細な情報を表示するための組み込みレポーターを提供します。テスト実行結果の.html ファイルを生成します。 |
N/A |
JUnit 4 vs. JUnit 5
最新バージョンのJUnitであるJUnit 5がリリースされ、フレームワークには複数の変更と新機能が追加されました。2つのバージョン間の違いは以下の表にリストされています:
criteria | JUNIT4 | JUNIT5 |
---|---|---|
アーキテクチャ | すべてが1つのJARファイルにパッケージ化されていました。 | 3つのサブプロジェクトに分割されています: – JUnitプラットフォーム – JUnit Jupiter – JUnit Vintage |
JDKバージョン要件 | Java 5以上が必要です | Java 8以上が必要です |
サードパーティーの統合 | プラグインやIDEのサポートにサードパーティーの統合はありません | サードパーティーの統合用の専用サブプロジェクト(JUnitプラットフォーム)が提供されます |
ネストされたテストのサポート | ネストされたテストを書くためのアノテーションが提供されていません | ネストされたテストを書くための@Nested アノテーションが提供されます |
カスタム拡張機能の登録サポート | カスタム拡張機能のサポートがありません | カスタム拡張機能を登録するための@ExtendWith アノテーションが提供されます |
よく使われるアノテーションの変更点 | – @BeforeClass – @AfterClass – @Before – @After – @Ignore |
– @BeforeAll – @AfterAll – @BeforeEach – @AfterEach – @Disabled |
タグ付けとフィルタリング用のアノテーションの変更 | @Category アノテーションが使用されます |
@Tag アノテーションが使用されます |
テストスイート | @RunWith および@Suite アノテーションが使用されました |
@Suite 、@SelectPackages 、および@SelectClasses アノテーションは使用されます |
JUnit 5の使い方
このセクションでは、IntelliJ IDEを使用してJUnit 5のテストケースを書く方法を学びます。JUnit 5がすでにバンドルされているため、使用するために追加のインストールを行う必要はありません。
新しいMavenプロジェクトを作成し、JUnit 5の依存関係を追加し、すぐにテストを書き始める必要があります。
MavenプロジェクトにJUnitの依存関係を追加する
次のJUnit 5の依存関係をpom.xmlファイルに追加する必要があります:
- JUnit Jupiter Engine
- JUnit Jupiter API
- JUnit Platform Suite(アグリゲーター)
- JUnit Jupiter Params
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
こちらが完全なpom.xmlファイルです
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.mfaisalkhatri</groupId>
<artifactId>junit-basic</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>junit-basic</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
依存関係を追加した後、テストを書く準備が整いました。しかし、JUnit 5を使用してテストを書く前に、テストスイートを効率的にセットアップし、望ましいようにテストを実行するのに役立つ基本的なアノテーションを理解しましょう。
JUnit 5で使用される基本的なアノテーション
以下は、JUnit 5を使用してテストを書く際に開発者によって最も一般的に使用される基本的なアノテーションです。
@BeforeAll アノテーション
@BeforeAll
アノテーションは、注釈付きのメソッドが現在のクラス内のどの@Test
, @RepeatedTest
, @ParameterizedTest
, @TestFactory
メソッドよりも前に実行されるべきであることを示します。テストクラス内の静的メソッドである必要があります。
@BeforeAll
は、JUnit 4.xで使用されていた@BeforeClass
アノテーションの代替として機能します。
構文:
public class BasicTest {
public static void beforeAllTest() {
System.out.println("Before All method called!!");
}
//..
}
@BeforeEachアノテーション
@BeforeEach
アノテーションは、注釈付きのメソッドが現在のクラス内の@Test
, @RepeatedTest
, @ParameterizedTest
, @TestFactory
メソッドの各呼び出しの前に実行されるべきであることを示します。
これはテストライフサイクルメソッドの一部であり、JUnit 4で使用されていた@Before
アノテーションの代わりとなります。
構文:
public class BasicTest {
public void beforeEachTest() {
System.out.println("Before Each method called!!");
}
//...
}
@AfterAllアノテーション
@AfterAll
アノテーションは、現在のクラス内のすべてのテストが実行された後に、注釈付きのメソッドが呼び出されるべきであることを示します。静的メソッドであり、テストクラス内の後始末メソッドとして使用されます。
@AfterAll
アノテーションは、JUnit 4の@AfterClass
アノテーションの代替となります。
構文:
public class BasicTest {
//...
public static void afterAllMethod() {
System.out.println("After All method called!!");
}
}
@AfterEachアノテーション
@AfterEach
アノテーションは、注釈付きのメソッドが現在のクラス内の各@Test
, @RepeatedTest
, @ParameterizedTest
, @TestFactory
メソッドの後に実行されるべきであることを示します。
これは、JUnit 4で使用されていた@After
注釈のJUnit 5用の置換として機能します。
構文:
public class BasicTest {
//...
public void afterEachMethod() {
System.out.println("After Each method called!!");
}
}
@Test注釈
@Test
注釈は、注釈付きのメソッドがテストメソッドであることを示します。テストメソッドはprivateまたはstaticメソッドではなく、値を返してはいけません。
構文:
public class BasicTest {
//..
public void testMethod() {
System.out.println("Test Method Called!!");
}
}
@DisplayName注釈
@DisplayName
注釈は、注釈付きのテストクラスまたはメソッドのためのカスタム名を指定するために使用されます。これらのカスタム名には、スペース、特殊文字、絵文字さえ含めることができ、通常はIDEやビルドツールによって生成されるテストレポートで利用されます。
構文:
"Demo Test class") (
public class BasicTest {
//...
"This is a demo test") (
public void testMethod() {
System.out.println("Test Method Called!!");
}
}
@Disabled注釈
JUnit 5の@Disabled
注釈は、テストメソッドまたはテストクラスをテストスイートから除外するために使用されます。
テストクラスに適用されると、テストクラス内のすべてのメソッドが自動的に無効と見なされます。この注釈には、テストを無効にする理由を指定するオプションのパラメータがあります。
構文:
public class BasicTest {
"Test method disabled") (
public void testMethod() {
System.out.println("Test Method Called!!");
}
//...
}
JUnit 5を使用した自動化テストケースの作成方法
コードに入り、JUnit 5で実際の作業を始める時が来ました。新しいJavaクラス、BasicTestを作成します。
public class BasicTest {
//..
}

デモンストレーションの一環として、議論したすべての基本的な注釈がカバーされます。
BasicTestクラスにメソッドを追加して、JUnit 5で使用可能な@BeforeAll
、@BeforeEach
、@AfterAll
、@AfterEach
、@Test
、@DisplayName
、@Disabled
アノテーションの使用方法をデモンストレーションしましょう。
"Demo Test class") (
public class BasicTest {
public static void beforeAllTest() {
System.out.println("Before All method called!!");
}
public void beforeEachTest() {
System.out.println("Before Each method called!!");
}
"This is a demo test") (
public void testMethodOne() {
System.out.println("Test Method One Called!!");
}
"This test is disabled to demo disable annotation") (
public void disabledTest() {
System.out.println("This is a disabled test!!");
}
public void testMethodTwo() {
System.out.println("Test Method Two Called!!");
}
public void afterEachMethod() {
System.out.println("After Each method called!!");
}
public static void afterAllMethod() {
System.out.println("After All method called!!");
}
}
コードの概要
テストクラス上の@DisplayName
アノテーションは、テストが実行されたときに結果でテスト名を「Demo test class」として表示します。
beforeAllTest()
メソッドは、どのテストが実行される前に実行され、“Before All method Called!!”
というテキストを出力します。次に、beforeEachTest()
メソッドは、各テストの前に実行され、“Before Each Method called!!”
というテキストを出力します。
このクラスには、testMethodOne()
、testMethodTwo()
、disabledTest()
の3つのテストメソッドがあります。これらの3つのテストメソッドには、@Testアノテーション
が付いており、これらがテストメソッドであることを示しています。
disabledTest()
メソッドは、@Disabled
アノテーションが付いているため、実行されません。
すべてのテスト実行が完了すると、afterEachTestMethod()
が実行されます。これは、@AfterEach
アノテーションが付いているためです。
最後に、すべてのテストが実行された後、afterAllMethod()
が実行されます。これは、@AfterAll
アノテーションが付いているためです。
テストの実行
テストは、テストクラスを右クリックして、「<Test class Name>」(この場合は“BasicTest”)を選択することで実行できます。

別の方法としては、以下のスクリーンショットに示すように、テストクラス宣言の横にある緑色の再生アイコンをクリックする方法があります:

以下のIntelliJ IDEのスクリーンショットでは、テストが正常に実行されたことがわかります。

上記のスクリーンショットで、テストクラスの表示名が表示され、無効になっているテストも表示されており、無効になっている理由がコンソールに表示されていることがわかります。
それ以外のすべてのテストメソッド、beforetestおよびaftertestを含むメソッドが正常に実行され、それぞれの結果がコンソールに表示されました。
サマリー
開発者がコードのユニットテストを実行するために使用する強力なテストフレームワークであるJUnit 5。テスト自動化エンジニアがテスト自動化スクリプトを記述して実行するためにも使用されます。開発者やテスターがテストスクリプトを記述し、コードのユニットテストを実行するための豊富な機能を提供しています。
自動化テストを記述して実行するだけでなく、アサーションや検証を実行するための複数のメソッドも提供しており、テストスクリプトの作成と実行に役立ちます。テストスクリプトの実行結果を利害関係者にデモンストレーションするために使用できるテストレポートも提供されています。
ハッピーなテスト!
Source:
https://dzone.com/articles/beginners-guide-to-junit-5