##ワーディング
- SUT(System Under Test):テスト対象となるクラスやオブジェクトを指す
- 実測値(actual value):テスト対象となるオブジェクトやクラスにメソッド呼び出しなどの操作を行い、メソッドが返す値やオブジェクトの変改する状態
- 期待値(expected value):仕様から一意に決まるもの。仕様変更がなければ不変な値
- テストフィクスチャ(test fixtures):テストの実行時に必要とされるすべてのデータや状態のこと
- アサーション(assertion):比較検証のしくみのこと。「テスト結果である実測値が期待値と一致する」という宣言
- アノテーション:Java5で導入された言語仕様の一つで、クラス、メソッド、変数などに補助的な情報を宣言するための仕様。JUnitでも複数のアノテーションを提供している
##テストメソッドの制約
- publicメソッドとする
- org.junit.Testアノテーションを付与する
- 戻り値をvoidとし、引数を持たない
##4フェーズテスト
<<<<<<< HEAD
- 事前準備(set up):テスト対象オブジェクトと(SUT)の初期化、必要な入力値、期待される結果などの準備を行う
======= - 事前準備(set up):テスト対象オブジェクト(SUT)の初期化、必要な入力値、期待される結果などの準備を行う
EDIT_REQUEST
- 実行(exercise):SUTに対し、テストする操作を1つだけ行う
- 検証(verify):テストの結果として得られた実測値が期待値と同等であるかを比較検証する
- 後処理(tear down):次のテストの実行に影響がないように後始末する。「Garbage Collection」によりほとんどの場合は省略
##テストコードのベストプラクティス
- 一定のパターンで同じようなコードが多くなる傾向があるが、プロダクションコードのように整理(重複排除)すべきではない
- 可動性が低下するため
- どこまで重複を排除するかはセンスが問われるところ
- 1つのテストケースでは1つのSUTを対象にしなければならない
- 複数のSUTが存在すると何のテストをしているのかが不明瞭になるため
- クラスごとに対応するテストクラスを作る
- テスト対象と同じパッケージに
- クラス名を「テスト対象のクラス名+Test」に
- テスト対象のクラスのインスタンスを生成する際に、変数名を「sut」とすると良い
- テスト対象オブジェクトがどれであるかが理解しやすくなる
- コンストラクタを検証する際は変数名を「instance」とすると良い
- 実測値の変数名は「actual」、期待値の変数名は「expected」とすると良い
- 一般的なコーティング標準では、変数名として意味のある名前を付けるのがいいが、テストコードでは仕様上の意味ではなく、期待値であるか実測値であるかの把握が重要
- 4フェーズの区切りをコメントとして記述しておくと読みやすくなる
- @Beforeアノテーションがついたメソッド名は「setUp」とすると良い
- @Afterアノテーションがついたメソッド名は「tearDown」とすると良い
##テストメソッドのベストプラクティス
- メソッド名はJavaの仕様に従う範囲で日本語(母国語)を入れる
- 関わる全員が日本語をわかる前提
- メソッド名だけでテスト内容がわかる
- レポートを出す際にも理解しやすくなる
- 「throws Exceptionの禁止」は適用しない
- テストメソッドはJUnitによって実行され、例外処理はフレームワーク上で行われます。(予期しない例外が起きても、JUnitがよしなに処理してくれる)
##アサーション
- assertThatメソッドをstaticインポートして利用する
- テストコードを自然言語に近い構文とするため
- asserThat(actual, is(expected)); → assert that actual is expected
##JUnitが提供するアノテーション
- @Test:テストメソッドを宣言する
- 使用可能お属性
- expected:例外の創出を検証するテストで、送出が期待される例外クラスを指定する
- timeout:ユニットテストのタイムアウト値(ミリ秒)を設定する。パフォーマンステストのために利用する機能ではない
- @Ignore:テストの実行から除外する
- 基本的には常にすべてを実行し、成功するようにすべきだが、都合により一時的にテストの実行を制御した場合に使用
- @Before:テストの実行前の処理を行う
- void、public、引数を持たない必要がある
- 主に初期化処理のため使うが、クラス内の各テストメソッドの共通処理に限る必要がある
- テストクラス間で共通処理が必要な場合は「ルール」機能を使うべき
- @After:テスト実行後に処理を行う
- void、public、引数を持たない必要がある
- テストの成功/失敗にかかわらず必ず実行される
- @BeforeClass:テストの実行前に一度だけ処理を行う
- void、public、static、引数を持たない必要がある
- テストメソッドは基本的に独立しているべきだので、使うシーンが多くはない
- 一部のライブラリの制約によりテストクラス単位で行わなければならない状況や、データの初期化のコストが大きくテストメソッド毎に実行できないような状況で使用すべき
- @AfterClass:テストの実行前に一度だけ処理を行う
- 詳細は@BeForeClassと同様