2010-02-26

http://anond.hatelabo.jp/20100226151925

うーん、そこは JUnit の使い方でなんとでもなる。

1つのテストケース動かす度にテーブル作り直すとかありえないし。

テーブルは作り直さずとも、テーブルの中身を truncate でひっくり返して、事前データをブチ込み直すくらいならば平気。

銀行系での例。マジ怒られそうだから、若干ボカして書くけど、

ひとつテストメソッド TestXxxDAO.testRetrieveFooBar() は、XxxDAO.retrieveFooBar() メソッドについての複数のパターンテストを全てやる事にする。そのテストメソッドの中で

  1. 事前のデータDB に突っ込む
  2. メソッドへの引数を準備
  3. XxxDAO.retrieveFooBar() を実行
  4. 想定結果と比較して、テストに失敗した箇所について報告
  5. 最初に戻る(次の事前データや、メソッドへの引数を準備する)

というサイクルを繰り返す。テストデータや想定結果は、全て OpenOffice calc なんかを使って、視覚的に書いておく。その ods ファイルを読み、DB突っ込み、想定結果と比較する処理は独自フレームワークとして用意。ods ファイルは、「こういうデータを準備して、こういう引数でメソッドを呼ぶと、こういう結果になりました」というテストエビデンスにもなる。

insert 後に select とかってのが切り離して考えられない処理ならば、それはそういう 1 単位の挙動だ。俺なら例えば、XxxDAO.insertFoo()、XxxDAO.retrieveBar() を作ってテストした上で、そいつらを XxxLogic.doSomething() に押し込むね。そしてやはり上記のようなテストが出来る。

頭の中だけだと「それって現実的じゃなくね?」と思えるかも知れないけど、実際やってみるといい。テスト順なんか気にせずにやっつけてしまえるし、案外これで効率よく厳密なテストが出来る。それでもヘタクソな野郎は、テスト順に依存したテストを作りやがって、後でメンテする俺涙目みたいな事にもなるけど。

これでテストデータを作るのが死にそうなほど大変であれば、メソッドの粒度を見直すべきかも知れない、というセンサーにもなる。・・もっとも、XxxLogic.doSomething() などを処理順に纏めた XxxAction.action() なんかのテストともなれば、やっぱ大変なんだけども。

記事への反応 -

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん