JAVA で 単体テストを自動化するための JUnit についてを解説

<br>

## ■ はじめに
<br>

JAVAでコーディングしたコードの単体テストを行う際には様々な方法がありますが、
今回紹介する`JUnit`はJavaで単体テストを自動化するためのフレームワークです。

テストを自動化することは人為的なテストの漏れやミスを減らし、プロジェクトの品質向上に繋がります。
この記事ではJUnitの基本的な使い方から実際のテストケースの作成方法を解説していきます。

## ■ 目次
<br>

1. [JUnitのインストールとセットアップ](#1-junitのインストールとセットアップ)
2. [JUnitでの基本的なテストの書き方](#2-junitでの基本的なテストの書き方)
3. [アサーションを使ったテストの実施](#3-アサーションを使ったテストの実施)
4. [JUnitのライフサイクルメソッド](#4-junitのライフサイクルメソッド)
5. [まとめ](#5-まとめ)

## 1. JUnitのインストールとセットアップ
<br>

まず最初にJUnitを使うための環境をセットアップを行う必要があります。
`Maven`や`Gradle`などのビルドツールを使ってJUnitの依存関係をプロジェクトに追加できますが、
今回はMavenを使ったセットアップ手順となります。

#### Mavenの依存関係追加

Mavenで使用する`pom.xml`に以下のように依存関係の記載を追記します。

```xml
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>
```

上記を追加し保存することで、JUnitを使用するための準備が整いました。
（Versionは適宜書き換えて使用してください。）

## 2. JUnitでの基本的なテストの書き方
<br>

JUnitの基本としては、アノテーション[^1]を活用してテストを行います。
アノテーションはテスト対象のメソッドが期待通りの動作をするか確認するためのもので、
「`@Test`」、「`@BeforeEach`」、「`@AfterEach`」など様々な種類があります。

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

public class CalculatorTest {
    @Test
    void testAdd() {
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        assertEquals(5, result);
    }
}
```

上記では「`@Test`」アノテーションをメソッドの前に付与しており、これはテストメソッドに付けることで、そのメソッドがテストであることを示しています。
メソッドの内容としては```int result = calculator.add(2, 3);```の行で
add()メソッドが2と3を足して5になることを確認しています。

その次の行の`assertEquals`はテストでよく使われるアサーションで、resultが5であるかを確認できます。

## 3. アサーションを使ったテストの実施
<br>

JUnitのテストでは上記の`assertEquals`のようにアサーションを使って期待される結果を検証します。
以下が代表的なアサーションメソッドです。

|アサーション|説明|
|:---:|:---:|
|assertEquals(expected, actual)|期待値と実際の値が一致するかを確認|
|assertTrue(condition)|条件がtrueであることを確認|
|assertFalse(condition)|条件がfalseであることを確認|
|assertThrows(expectedType, executable)|指定した例外がスローされることを確認|


## 4. JUnitのライフサイクルメソッド
<br>

JUnitには「テスト全体の前に一度だけ実行されるメソッド」や、「各テストの前後に実行されるメソッド」などの
テストの前後で特定の処理を行うための`ライフサイクルメソッド`と呼ばれるメソッドがあります。

|アノテーション|説明|
|:---:|:---:|
|`@BeforeAll`|全テストの前に一度だけ実行される（static指定）|
|`@BeforeEach`|各テストメソッドの前に実行される|
|`@AfterEach`|各テストメソッドの後に実行される|
|`@AfterAll`|全テストの後に一度だけ実行される（static指定）|

具体的には以下のように「@」でアノテーションとして使用します。

```java
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;

public class CalculatorTest {
    @BeforeAll
    static void initAll() {
        System.out.println("テスト全体の前に一度だけ実行");
    }

    @BeforeEach
    void init() {
        System.out.println("各テストの前に実行");
    }

    @Test
    void testAdd() {
        // テスト処理
    }

    @AfterEach
    void tearDown() {
        System.out.println("各テストの後に実行");
    }

    @AfterAll
    static void tearDownAll() {
        System.out.println("テスト全体の後に一度だけ実行");
    }
}
```

## 5 まとめ
<br>

- JUnitとは？
    - Javaでの単体テストを自動化するためのフレームワーク
    - 自動テストにより、テストの漏れやミスを減らし、プロジェクトの品質向上に貢献
- JUnitのインストールとセットアップ
    - MavenやGradleを使ってJUnitをセットアップ可能
    - Mavenの場合は、pom.xmlに依存関係を追加して準備完了
- 基本的なテストの書き方
    - Testアノテーションを使ってテストメソッドを定義
    - アサーションを用いて期待される結果と実際の結果を比較
- アサーションを使ったテスト
    - assertEquals、assertTrue、assertFalseなど、各種アサーションでテスト結果を検証
- JUnitのライフサイクルメソッド
    - BeforeAllやBeforeEachなど、テストの前後で共通処理を実行可能
    - 特定の処理を各テストメソッドの前後で実行できる

[^1]:テストを簡単に書けるようにしてくれる「@」で始まる注釈