ユニットテストはコード内の最小テスト可能単位(通常は関数やメソッド)が期待通りに動作することを検証します。システムの他の部分から独立し、特定の機能に焦点を当てる必要があります。
優れたユニットテストはコード品質と保守性を確保し、問題の迅速な特定やリファクタリング時の安全性を提供します。以下に効果的な実践方法を示します。
テスト設計の原則
- 可読性の高いテストコード: 明確な命名規則を用い、構造を整理する
- テストの独立性: 環境や実行順序に依存しない設計
- モックオブジェクトの活用: 外部依存を排除した安定したテスト環境の構築
- 境界条件のテスト: 最小値・最大値・異常値の包括的な検証
- コードパスの完全カバレッジ: 条件分岐や例外処理の網羅的なテスト
- 保守性の確保: シンプルで理解しやすいテストコードの維持
実装例
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)); // アンダーフロー検証
}
}