単体試験(1)

少しずつ書いていく。
最近、特に単体試験のための自分なりのデザインパターンに対する考えをまとめている。私にとって、メソッド単位の試験と、クラス単位の試験が単体試験になる。メソッド単位の試験とは、ある入力に対するメソッドの出力が、想定していたもの(ここでは仕様と呼ぶ)と合致するかを調べることだ。なお、オブジェクトのプロパティや外部環境からの入力はメソッドの入力に該当し、プロパティの変更や外部環境への出力などの副作用は出力に該当する。
簡単な例を示す。

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

このようなメソッドが与えられたとしよう。このとき、メソッドの入力は「a」「b」となり、メソッドの出力は「a+b」の計算結果となる。
もう一つ例を示す。

int property;
int add3AndPrint( int a, int b ){
  System.out.println(a+b);
  return property + a + b;
}

このようなメソッドとプロパティが与えられたとする。このとき、メソッドの入力は「a」「b」「property」となり、メソッドの出力は「a+b」「property+a+b」となる。
単体試験の王道は、このメソッドの入力に対するメソッドの出力が正しいかを確認することにある。そして、単体試験のためのデザインパターンは、単体試験を効率的に行うための、機能プログラム(試験対象プログラム)の書き方と、試験プログラムの書き方だと考えている。すなわち、試験のためのパターンは、次の2種類に分類されるというわけだ。

  • テストコードのためのパターン
  • 機能コードのためのパターン