Kent BeckのxUnitテストパターン
Kent Beckの『テスト駆動開発入門』で紹介されている33のテストパターンを、簡単に一覧で紹介。テストパターンに関する原典的な意味合いもあり押さえておく必要があるが、テスト実践に直接役立てるには少々内容が漠然としすぎている。それでも、「■テストに関するパターン」あたりは実践色が強く、役に立ちそう。
■テスト駆動開発のパターン
・テスト(名詞)
自動テストを書こう。自動テストによって、開発のデススパイラルから抜け出せる。
・独立したテスト
テストは互いに独立でなければならない。他に影響するようなテストを書いてはいけない。
・テストリスト
何をテストすればいいか迷うので、まずテストリストを作ることから始める。
・テストファースト
テストを書き始めるタイミングは、テスト対象のコードを書き始める前に。
・アサートファースト
テストを書くときは、まずアサート(結果のチェック)から書き始める。そこから遡って、そのアサート文を実行させるために必要なコードを前に付け足していく。
・テストデータ
テストで扱うデータは、テストの意図を分かりやすくするために、意味のあるデータを使う。無意味なデータでテストしてはならない。
・明示的データ
結果を比較するときは、期待される値と実際の値との関係が明確に分かるような形でテストを記述する。たとえば、消費税5%で100円の税込金額をテストしたかったら、計算結果を105と比較せずに、100 * (1 + 0.05) と比較する。
■レッドバーに関するパターン
・1歩を表現するテスト
テストリストの中から次に実装するテストは、何かを教えてくれて、かつ実装できそうなものを選ぶ。
・最初のテスト
最初に実装するテストは、メソッド呼び出しをほとんどしない単純なものにする。とにかく、なんらかのフィードバックをテストから得ることが大事。
・説明用のテスト
自動テストを普及させるには、高圧的にテスト駆動開発を押し付けるのではなく、質問してきたらテストを使って説明し、教えてもらうときにはテストを使って説明してもらう。テストの実演がポイント。
・学習用のテスト
外部からのコンポーネントの使い方を学ぶときに、ついでにそれをテストの形で残しておく。
・その他のテスト
議論をしていて、横道に逸れるが面白いアイデアが出てきたら、とりあえずテストリストにそれを追加して、話を本題に戻す。テストリストはそういうTODOリストのような使い方をしてもいい。
・回帰テスト
バグが報告されたら、まずそれを再現するテストを書いてから、バグ修正を行なう。
・休憩
疲れていたり、行き詰ったら、休憩する。
・やり直し
問題のあるコードは、躊躇せずに破棄して一から書き直す。
・安価な机、良質な椅子
他はケチってもいいから、椅子だけは本当にいいものに座る。(XPと椅子)
■テストに関するパターン
・下位のテスト
テストケースが大きすぎて簡単にはテストをパスできないときは、小さなテストケースに分割する。
・モックオブジェクト
高価なリソースに依存するオブジェクトをテストする場合は、実際にはそのリソースを利用しない仮オブジェクトをテスト用に作る。
・自己接続
オブジェクト間で正しく通信が行なわれているかをチェックするには、オブジェクトとテストケースとを通信させる。テストのためにわざわざモックオブジェクトを用意するのはムダ。
・ログ文字列
メソッド呼び出しの順番をテストするには、テストが呼び出される毎にログに文字列を残し、最後にそのログ文字列を確認する。
・クラッシュテストダミー
エラー発生時の挙動をテストする場合は、例外だけをスローするオブジェクト(=クラッシュテストダミー)を作る。
・失敗するテスト
1人でプログラミングしているときは、プログラミング終了時に最後のテストだけ失敗のままにしておく。次に再開するときに、どこから始めればいいかすぐに思い出せる。
・きれいなチェックイン
チームでプログラミングしているときは、すべてのテストがパスする状態でプログラミングを終了する。
■グリーンバーに関するパターン
・仮実装(本実装までの)
まずは定数を返すようなものでもいいから、とりあえずテストをパスする実装をでっち上げる。それから、リファクタリングして正しい実装に置き換える。
・三角測量
抽象度の高いメソッドを作るときは、2つ以上の具体例をテストケースに盛り込む。
・明白な実装
難しく考えずに、シンプルに実装する。
・1から多
コレクションを使う操作を実装する場合、まずコレクションを使わないで実装し、それからコレクションを導入する。
■xUnitに関するパターン
・アサート
テストの成否チェックには、アサート(論理式)を使う。
・フィクスチャ
複数テストで共通して使われるオブジェクトを作成するには、インスタンス変数を使い、setUpメソッドで初期化する。
・外部のフィクスチャ
テスト後に外部リソースを解放するには、tearDownメソッドを使う。
・テストメソッド
テストケースは、test~で始まるメソッドで表現する。
・例外のテスト
例外がスローされることをテストするには、例外がスローされなかったときにテストに失敗するようにする。スローされたらそれを捕捉して、単に何もしない。
・すべてのテスト
すべてのテストを一度に実行するには、スイートを作成する。パッケージ毎に1スイート作成し、アプリケーション全体のテストには、パッケージ毎のスイートをまとめて1つのスイートを作る。
- ケント ベック, Kent Beck, 長瀬 嘉秀, テクノロジックアート
- テスト駆動開発入門
■テスト駆動開発のパターン
・テスト(名詞)
自動テストを書こう。自動テストによって、開発のデススパイラルから抜け出せる。
・独立したテスト
テストは互いに独立でなければならない。他に影響するようなテストを書いてはいけない。
・テストリスト
何をテストすればいいか迷うので、まずテストリストを作ることから始める。
・テストファースト
テストを書き始めるタイミングは、テスト対象のコードを書き始める前に。
・アサートファースト
テストを書くときは、まずアサート(結果のチェック)から書き始める。そこから遡って、そのアサート文を実行させるために必要なコードを前に付け足していく。
・テストデータ
テストで扱うデータは、テストの意図を分かりやすくするために、意味のあるデータを使う。無意味なデータでテストしてはならない。
・明示的データ
結果を比較するときは、期待される値と実際の値との関係が明確に分かるような形でテストを記述する。たとえば、消費税5%で100円の税込金額をテストしたかったら、計算結果を105と比較せずに、100 * (1 + 0.05) と比較する。
■レッドバーに関するパターン
・1歩を表現するテスト
テストリストの中から次に実装するテストは、何かを教えてくれて、かつ実装できそうなものを選ぶ。
・最初のテスト
最初に実装するテストは、メソッド呼び出しをほとんどしない単純なものにする。とにかく、なんらかのフィードバックをテストから得ることが大事。
・説明用のテスト
自動テストを普及させるには、高圧的にテスト駆動開発を押し付けるのではなく、質問してきたらテストを使って説明し、教えてもらうときにはテストを使って説明してもらう。テストの実演がポイント。
・学習用のテスト
外部からのコンポーネントの使い方を学ぶときに、ついでにそれをテストの形で残しておく。
・その他のテスト
議論をしていて、横道に逸れるが面白いアイデアが出てきたら、とりあえずテストリストにそれを追加して、話を本題に戻す。テストリストはそういうTODOリストのような使い方をしてもいい。
・回帰テスト
バグが報告されたら、まずそれを再現するテストを書いてから、バグ修正を行なう。
・休憩
疲れていたり、行き詰ったら、休憩する。
・やり直し
問題のあるコードは、躊躇せずに破棄して一から書き直す。
・安価な机、良質な椅子
他はケチってもいいから、椅子だけは本当にいいものに座る。(XPと椅子)
■テストに関するパターン
・下位のテスト
テストケースが大きすぎて簡単にはテストをパスできないときは、小さなテストケースに分割する。
・モックオブジェクト
高価なリソースに依存するオブジェクトをテストする場合は、実際にはそのリソースを利用しない仮オブジェクトをテスト用に作る。
・自己接続
オブジェクト間で正しく通信が行なわれているかをチェックするには、オブジェクトとテストケースとを通信させる。テストのためにわざわざモックオブジェクトを用意するのはムダ。
・ログ文字列
メソッド呼び出しの順番をテストするには、テストが呼び出される毎にログに文字列を残し、最後にそのログ文字列を確認する。
・クラッシュテストダミー
エラー発生時の挙動をテストする場合は、例外だけをスローするオブジェクト(=クラッシュテストダミー)を作る。
・失敗するテスト
1人でプログラミングしているときは、プログラミング終了時に最後のテストだけ失敗のままにしておく。次に再開するときに、どこから始めればいいかすぐに思い出せる。
・きれいなチェックイン
チームでプログラミングしているときは、すべてのテストがパスする状態でプログラミングを終了する。
■グリーンバーに関するパターン
・仮実装(本実装までの)
まずは定数を返すようなものでもいいから、とりあえずテストをパスする実装をでっち上げる。それから、リファクタリングして正しい実装に置き換える。
・三角測量
抽象度の高いメソッドを作るときは、2つ以上の具体例をテストケースに盛り込む。
・明白な実装
難しく考えずに、シンプルに実装する。
・1から多
コレクションを使う操作を実装する場合、まずコレクションを使わないで実装し、それからコレクションを導入する。
■xUnitに関するパターン
・アサート
テストの成否チェックには、アサート(論理式)を使う。
・フィクスチャ
複数テストで共通して使われるオブジェクトを作成するには、インスタンス変数を使い、setUpメソッドで初期化する。
・外部のフィクスチャ
テスト後に外部リソースを解放するには、tearDownメソッドを使う。
・テストメソッド
テストケースは、test~で始まるメソッドで表現する。
・例外のテスト
例外がスローされることをテストするには、例外がスローされなかったときにテストに失敗するようにする。スローされたらそれを捕捉して、単に何もしない。
・すべてのテスト
すべてのテストを一度に実行するには、スイートを作成する。パッケージ毎に1スイート作成し、アプリケーション全体のテストには、パッケージ毎のスイートをまとめて1つのスイートを作る。