JUnit 実践入門 体系的に学ぶユニットテストの技法 - 第7章 テストフィクスチャ テストデータや前提条件のセットアップ

第7章 テストフィクスチャ テストデータや前提条件のセットアップ

7.1 テストフィクチャとは

  • テストで扱う、データやテスト実行環境、オブジェクトの状態など

ユニットテストのテストフィスクチャ

  • テスト対象オブジェクト
  • 入力値
  • 期待値
  • テスト実行までに必要な、テストオブジェクトの操作
  • ファイルなど外部リソース
  • データベースやソケットサーバなど、外部システム
  • 依存クラスや依存外部システムのモックオブジェクト

  • 一般にテスト実行フェーズよりも、セットアップのコードのほうが長くなる

フレッシュフィクスチャ

  • フィクスチャはテストケースごとに独立し、テスト実行ごとに初期化され、終了時に開放する → フレッシュフィクスチャ戦略

フィクスチャとスローテスト問題

  • フィクスチャのセットアップに長い時間がかかること → スローテスト問題 slow tests
    • DB のテーブルデータ全レコード削除とかやってるから
  • テストの並列実行、共有フィクスチャ、カテゴリ化テストなどの解決策

共有フィクスチャ

  • 共有フィクスチャは、スローテスト問題 shared fixture の解法の一つ
  • テストケースごとの独立性が弱くなる問題
  • テストコードのメンテナンス性低下。あるフィクスチャを参照しているテストケースは、全部でどれだけ??

7.2 フィクスチャのセットアップパターン

インラインセットアップ

  • テストメソッドごとにフィクスチャのセットアップを行う
  • コードでの見通しが良くなるが、長すぎると可読性は下がる
    • 20 行がひとつの目安

暗黙的セットアップ

  • Before アノテーションが付与されたメソッド(セットアップメソッド)のこと
    • テストメソッド実行前に暗黙的 implicit に実行されるからね
    • 各初期化処理の共通部分
  • Enclosed テストランナーと相性良し
    • 構造化!共通前処理!インナークラス!

生成メソッドでのセットアップ

  • テストクラスをまたいで暗黙的セットアップは出来ない…
    • 共通した初期化処理を独立したクラスのメソッドに抽出する 生成メソッドパターン
  • staticインポートできるように、独立クラスにstaticで書くと幸せ。日本語メソッド名で内容を表示してあげるともっといいね

外部リソースからのセットアップ

  • Java はデータを生成するコードま記述か苦手。もっさりする。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)