単体試験 自動化(xUnit)の概念

単体テストは手作業で実施すると時間がかかります、しかも人間なので膨大な量をこなせば間違いも起きます。そしてソースコードを修正すると再実施が必要です。このような特性から、単体テストはテストコードで自動化するのが適切です。

1度目の単体テストで テストコードを書いて実行するのと、手作業でテストを実施するのを比較すると、テストコードを書くほうが圧倒的に時間がかかります。しかし、これは健全な時間の使い方です。

xUnitフレームワーク

Javaのテストコードといえば JUnitです。JUnit は xUnit のJava版です。xUnit とはプログラムの単体テストを行うためのフレームワークの総称で、shellスクリプトでもCOBOLでもJUnitのような単体テストのフレームワークあります。

xUnitフレームワークの設計上の特徴

xUnitは様々な言語で存在しますが、次のような特徴があります。これらはみなテストを最適化するためのものです。

テストフィクスチャ(コンテキスト)

テストを実行、成功させるために必要な状態や前提条件の集合を、フィクスチャと呼びます。
これらはテストコンテキストとも呼ばれる。私はテストコンテキストを呼ぶことが多いです。テストの実行前にテストに適した状態を整え、テスト実行後に元の状態を復元することが望ましいです。

テストスイート

同じテストコンテキストを共有するテストの集合を、テストスイートと呼ぶ。テストスイート内のそれぞれのテストの実行順序は保証されません。

テスト実行の流れ

個々のユニットテストは以下のような流れで実行されます。

1.最初に、テストのためのクリーンな環境(設定など)を用意する。

setup();

2.テスト本体の実行

ここはテストのための様々な処理を記載します。後ほど詳細を記載するアサーションがよく使われます。

3.最後は、テストが成功したか失敗したかに関わらず、他のテストやプログラムに影響を与えないよう、初めに用意したテスト用の環境を元に戻す。

teardown();

setup() と teardown() の各メソッドは、テストコンテキストの初期化とクリーンアップを行うためのものです。

アサーション(表明、検証)

テスト対象の関数やクラスなどについて、振る舞いや状態を確認するための関数やマクロを、アサーションと呼びます。Javaでは名前そのままな関数が色々とありますね。

アサーションが失敗した時(実際の実行結果が期待される結果と異なっていた場合)は、一般的には、例外が投げられ現在のテストの実行は中断されます。

私は一回一回止まるのが面倒なので、エラーが起きても最後までテスト実行し、最後にまとめてエラーを確認するようJUnitを書くことが多いです。