Java中級

中級 Javaで学ぶテスト駆動開発|アンチパターン編

導入

テスト駆動開発(TDD)は、ソフトウェア開発において品質を高めるための強力な手法です。しかし、実際の現場では多くのエンジニアが陥りがちなアンチパターンが存在します。本記事では、特に「テストの過剰依存」というケースに焦点を当て、その問題点と改善策を考察します。

教科書レベルの解説(テスト駆動開発)

重要な概念の整理

テスト駆動開発は、まずテストを作成し、その後に実装を行うというサイクルを繰り返す手法です。このアプローチにより、コードが期待通りに動作するかどうかを早期に確認でき、リファクタリングや新機能追加が容易になります。TDDの基本的な流れは以下の通りです。

  • テストを書く
  • テストを実行し失敗させる
  • 実装を行いテストを通す
  • リファクタリングを行う

コード例(Java)


public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

コードの行ごとの解説

  1. クラス `Calculator` を定義し、計算機能を持たせる。
  2. メソッド `add` は2つの整数を受け取り、その合計を返す。

アンチパターン編

テストの過剰依存は、テストが多すぎてコードの変更が難しくなる状況を指します。例えば、以下のようなコードがあるとします。


public class Calculator {
    public int add(int a, int b) {
        if (a < 0 || b < 0) {
            throw new IllegalArgumentException("Negative values are not allowed");
        }
        return a + b;
    }
}

上記のコードでは、負の値に対して例外を投げる処理が追加されています。しかし、これに対するテストケースが多くなると、テストのメンテナンスが煩雑になります。例えば、以下のようなテストケースが必要です。


public class CalculatorTest {
    @Test(expected = IllegalArgumentException.class)
    public void testAddNegativeValueA() {
        new Calculator().add(-1, 5);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testAddNegativeValueB() {
        new Calculator().add(5, -1);
    }
}

ここでの問題は、テストが増えることでコードの柔軟性が失われ、機能追加や変更が難しくなる点です。テストが多すぎると、テストを通すためにコードを複雑にすることがあり、最終的にはテストがコードの足枷になってしまいます。

まとめ

  • テストの過剰依存は、コードの変更を難しくする。
  • テストは重要だが、適切なバランスを保つことが求められる。
  • テストのメンテナンス性を考慮し、必要なテストケースを見極めることが大切。