SQL実行結果の正否ではなく発行したSQL文自体が意図どおりかでテストする

これは興味深かった。

はしょって言うと、

  1. junitを使った自動テストでは、前準備としてDBにデータをつっこんでおき、テスト対象クラスを実行してそこでのSQL実行結果が前準備どおりのデータとマッチするかでテストの正否を判定する、っていうのがよくある手法
  2. でもそれだと、前準備としてDBにデータをつっこむための、そのデータを準備すること自体が、意外と面倒。 (テーブル間に外部キーが張り巡らされてたりするとガチでめんどい)
  3. なら、「発行されたSQL文自体が正しいかどうか」でAssertすればいいじゃない。

みたいな。

筆者も前に似たようなことで悩んだ。発行したSQL文自体をデバッグログとして出したくなったのだが、いくらやっても「select a,b,c from foo where bar = ? 」を出すのが限界だった。 ほしいのは「select a,b,c from foo where bar = 'hogehoge'」、 つまり、?(プレースホルダ)の部分にも値がつっこまれた状態でのSQL文をDBに発行するに取りだすというのが、えらい面倒すぎて断念した覚えがある。

jdbcドライバの近辺にまでもぐりこまないと無理なはずなんだが、どうやらMockRunnerのJDBC Mockというやつはそれをやってのけているんじゃなかろうか。興味深い。

トラックバックURL

このエントリーのトラックバックURL:
http://www.ywcafe.net/mt/mt-tb.cgi/1138

コメント

数年前に同じようなことをやりました。単体テストではなく、結合テストなどの効率をあげるためだったんですが。

手元に何もないのでうろ覚えですが、たしかJDBCのAPIを自前で実装して、そこでログ出力などの処理をおこなって、残りの処理は本物のJDBCドライバーに委譲してたような気がします。同じ仕組みを使って、ログだけではなく、実行計画とかも出力できるようにしてました。

コメントする

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)


画像の中に見える文字を入力してください。