ユニットテストの実践ガイド

ユニットテストはコード内の最小テスト可能単位(通常は関数やメソッド)が期待通りに動作することを検証します。システムの他の部分から独立し、特定の機能に焦点を当てる必要があります。 優れたユニットテストはコード品質と保守性を確保し、問題の迅速な特定やリファクタリング時の安全性を提供します。以下に効果的な実践方法を示します。

テスト設計の原則

  • 可読性の高いテストコード: 明確な命名規則を用い、構造を整理する
  • テストの独立性: 環境や実行順序に依存しない設計
  • モックオブジェクトの活用: 外部依存を排除した安定したテスト環境の構築
  • 境界条件のテスト: 最小値・最大値・異常値の包括的な検証
  • コードパスの完全カバレッジ: 条件分岐や例外処理の網羅的なテスト
  • 保守性の確保: シンプルで理解しやすいテストコードの維持

実装例

Javaによる計算クラスとJUnitテストの実装例:

public class MathUtil {
  /**
   * 整数の合計値を返す
   * 
   * @param x 第一引数
   * @param y 第二引数
   * @return 合計値
   */
  public int sum(int x, int y) {
    return x + y;
  }
}

MavenプロジェクトでのJUnit依存関係:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13.2</version>
  <scope>test</scope>
</dependency>

テストケース実装:

import static org.junit.Assert.*;
import org.junit.Test;

public class MathUtilTest {

  @Test
  public void 正数加算テスト() {
    MathUtil util = new MathUtil();
    assertEquals(8, util.sum(5, 3));
  }

  @Test
  public void ゼロ加算テスト() {
    MathUtil util = new MathUtil();
    assertEquals(7, util.sum(7, 0));
  }

  @Test
  public void 負数加算テスト() {
    MathUtil util = new MathUtil();
    assertEquals(-9, util.sum(-4, -5));
  }

  @Test
  public void 最大値境界テスト() {
    MathUtil util = new MathUtil();
    assertEquals(Integer.MAX_VALUE, util.sum(Integer.MAX_VALUE, 0));
    assertEquals(Integer.MIN_VALUE, util.sum(Integer.MAX_VALUE, 1)); // オーバーフロー検証
  }

  @Test
  public void 最小値境界テスト() {
    MathUtil util = new MathUtil();
    assertEquals(Integer.MIN_VALUE, util.sum(Integer.MIN_VALUE, 0));
    assertEquals(Integer.MAX_VALUE, util.sum(Integer.MIN_VALUE, -1)); // アンダーフロー検証
  }
}

タグ: JUnit ユニットテスト Java テストケース テスト設計

6月16日 17:44 投稿