単体テストは手作業で実施すると時間がかかります、しかも人間なので膨大な量をこなせば間違いも起きます。そしてソースコードを修正すると再実施が必要です。このような特性から、単体テストはテストコードで自動化するのが適切です。
1度目の単体テストで テストコードを書いて実行するのと、手作業でテストを実施するのを比較すると、テストコードを書くほうが圧倒的に時間がかかります。しかし、これは健全な時間の使い方です。
xUnitフレームワーク
Javaのテストコードといえば JUnitです。JUnit は xUnit のJava版です。xUnit とはプログラムの単体テストを行うためのフレームワークの総称で、shellスクリプトでもCOBOLでもJUnitのような単体テストのフレームワークあります。
xUnitフレームワークの設計上の特徴
xUnitは様々な言語で存在しますが、次のような特徴があります。これらはみなテストを最適化するためのものです。
テストフィクスチャ(コンテキスト)
テストを実行、成功させるために必要な状態や前提条件の集合を、フィクスチャと呼びます。
これらはテストコンテキストとも呼ばれる。私はテストコンテキストを呼ぶことが多いです。テストの実行前にテストに適した状態を整え、テスト実行後に元の状態を復元することが望ましいです。
テストスイート
同じテストコンテキストを共有するテストの集合を、テストスイートと呼ぶ。テストスイート内のそれぞれのテストの実行順序は保証されません。
テスト実行の流れ
個々のユニットテストは以下のような流れで実行されます。
1.最初に、テストのためのクリーンな環境(設定など)を用意する。
setup();
2.テスト本体の実行
ここはテストのための様々な処理を記載します。後ほど詳細を記載するアサーションがよく使われます。
3.最後は、テストが成功したか失敗したかに関わらず、他のテストやプログラムに影響を与えないよう、初めに用意したテスト用の環境を元に戻す。
teardown();
setup() と teardown() の各メソッドは、テストコンテキストの初期化とクリーンアップを行うためのものです。
アサーション(表明、検証)
テスト対象の関数やクラスなどについて、振る舞いや状態を確認するための関数やマクロを、アサーションと呼びます。Javaでは名前そのままな関数が色々とありますね。
アサーションが失敗した時(実際の実行結果が期待される結果と異なっていた場合)は、一般的には、例外が投げられ現在のテストの実行は中断されます。
私は一回一回止まるのが面倒なので、エラーが起きても最後までテスト実行し、最後にまとめてエラーを確認するようJUnitを書くことが多いです。