🧪 Spring Framework 講座【第38回】䞍具合を芋逃さない〜単䜓テストUnit Testの基本〜

docs

前回たでで、Spring Bootを䜿ったアプリケヌション構築に必芁な䞻芁技術を網矅したした。しかし、どんなに優れたコヌドでも、**䞍具合バグ**は぀きものです。

ここからは、アプリケヌションの品質ず信頌性を保蚌するための重芁なプロセスであるテストに぀いお孊びたす。今回は、テストの基本ずなる単䜓テストUnit Testに焊点を圓お、Javaの暙準的なテストフレヌムワヌクであるJUnit 5の基本的な䜿い方を解説したす。


1. なぜ単䜓テストが必芁なのか

単䜓テストずは、アプリケヌションを構成する最小単䜍の郚品クラスやメ゜ッドなどが、単独で蚭蚈通りに正しく動䜜するかを確認するテストです。

  • 早期発芋: 開発の初期段階で䞍具合を芋぀けられるため、修正コストが最も安く枈みたす。
  • 安党な改修: テストコヌドが敎備されおいるず、既存の機胜が壊れおいないかをテストで確認できるため、安心しおコヌドの改修やリファクタリングが行えたす回垰テスト。
  • 仕様の明確化: テストコヌドは、「そのコヌドが䜕をすべきか」ずいう実行可胜な仕様曞の圹割を果たしたす。

2. Javaの暙準テストフレヌムワヌクJUnit 5

Spring Bootでは、暙準でJUnit 5Jupiterが導入されおおり、すぐに利甚できたす。

2-1. 基本的なアノテヌション

JUnit 5を䜿ったテストクラスの基本的な構造ずアノテヌションです。

アノテヌション甚途
@Testテストメ゜ッドであるこずを瀺したす。このメ゜ッドがテストランナヌによっお実行されたす。
@BeforeEach各テストメ゜ッドが実行される盎前に実行されたす。テストデヌタの初期化などに䜿甚。
@AfterEach各テストメ゜ッドが実行された盎埌に実行されたす。埌凊理などに䜿甚。
@DisplayNameテストクラスやテストメ゜ッドに、日本語などの分かりやすい名前を付けられたす。

2-2. テストクラスの構成䟋

Java

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*; // アサヌションメ゜ッドを利甚

@DisplayName("蚈算サヌビスクラスのテスト")
class CalculatorTest {

    private Calculator calculator; // テスト察象のクラス

    @BeforeEach
    void setUp() {
        // テスト前にCalculatorむンスタンスを初期化
        calculator = new Calculator(); 
    }

    @AfterEach
    void tearDown() {
        // 各テスト埌の埌凊理ここでは䜕もしない
    }

    @Test
    @DisplayName("2぀の数倀の加算が正しく行われるこず")
    void testAdd() {
        // 1. 実行Actual: 実際の結果
        int result = calculator.add(1, 2); 
        
        // 2. 怜蚌Expected: 期埅される結果
        // 実際の結果ず期埅される結果が䞀臎するかを怜蚌
        assertEquals(3, result, "1 + 2 は 3 になるはずです"); 
    }

    @Test
    @DisplayName("れロ陀算で䟋倖が発生するこず")
    void testDivideByZero() {
        // 特定の䟋倖がスロヌされるこずを怜蚌
        assertThrows(IllegalArgumentException.class, () -> {
            calculator.divide(10, 0);
        });
    }
}

3. 怜蚌アサヌションAssertionsクラス

テストにおいお最も重芁なのが、怜蚌Assertionです。JUnit 5では、org.junit.jupiter.api.Assertions クラスに甚意された静的メ゜ッドを䜿いたす。

メ゜ッド甚途
assertEquals(expected, actual, message)期埅倀ず実際の結果が等しいこずを怜蚌
assertTrue(condition)条件が true であるこずを怜蚌
assertFalse(condition)条件が false であるこずを怜蚌
assertNull(actual)倀が null であるこずを怜蚌
assertThrows(type, executable)指定されたコヌド実行時に特定の䟋倖がスロヌされるこずを怜蚌

4. 単䜓テストの原則䟝存関係の排陀

単䜓テストの目的は、その郚品クラス単独の動䜜を怜蚌するこずです。

もしテスト察象の Service クラスが Repository クラスに䟝存しおいた堎合、テスト䞭にDBアクセスが発生しおしたいたす。これでは、DBの状態によっおテストが倱敗する可胜性があり、玔粋な単䜓テストずは蚀えたせん。

原則: 単䜓テストでは、倖郚ぞの䟝存関係DB、倖郚API、DIコンテナをすべお排陀し、メモリ䞊だけで完結させるべきです。

この䟝存関係を排陀するために、**モックMockずスタブStub**ずいう技術が必芁になりたす。

✅ 本日のたずめ

  • **単䜓テストUnit Test**は、最小単䜍クラス、メ゜ッドのコヌドの動䜜を怜蚌し、早期に䞍具合を発芋しお改修の安党性を高める。
  • Spring Bootでは、暙準でJUnit 5を䜿甚する。
  • @Test でテストメ゜ッドを定矩し、Assertions クラスのメ゜ッドassertEquals、assertThrows などで怜蚌を行う。
  • 玔粋な単䜓テストのためには、テスト察象のクラスから倖郚ぞの䟝存関係DB、倖郚APIなどを排陀する必芁がある。

🔔 次回予告

単䜓テストの原則ずしお孊んだ「䟝存関係の排陀」を実珟するためには、どうすれば良いでしょうか。

次回は、テスト時に䟝存関係を停物に眮き換えるための匷力な技術、モックMockずスタブStub、そしおその実装に䞍可欠なラむブラリ Mockito の䜿い方を孊びたす。

次回【第39回】䟝存を断ち切る〜モックずMockitoによる単䜓テスト〜 にご期埅ください

コメント

タむトルずURLをコピヌしたした