SQL実行結果の正否ではなく発行したSQL文自体が意図どおりかでテストする
これは興味深かった。
- [Java]MockRunnerのJDBC Mockを使ってみた 2010-12-15 - 新・たけぞう瀕死の日記
- [Java]MockRunnerのJDBC Mockの便利機能 2010-12-19 - 新・たけぞう瀕死の日記
はしょって言うと、
- junitを使った自動テストでは、前準備としてDBにデータをつっこんでおき、テスト対象クラスを実行してそこでのSQL実行結果が前準備どおりのデータとマッチするかでテストの正否を判定する、っていうのがよくある手法
- でもそれだと、前準備としてDBにデータをつっこむための、そのデータを準備すること自体が、意外と面倒。 (テーブル間に外部キーが張り巡らされてたりするとガチでめんどい)
- なら、「発行された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というやつはそれをやってのけているんじゃなかろうか。興味深い。

コメント
数年前に同じようなことをやりました。単体テストではなく、結合テストなどの効率をあげるためだったんですが。
手元に何もないのでうろ覚えですが、たしかJDBCのAPIを自前で実装して、そこでログ出力などの処理をおこなって、残りの処理は本物のJDBCドライバーに委譲してたような気がします。同じ仕組みを使って、ログだけではなく、実行計画とかも出力できるようにしてました。
Posted by yyamano at 2010年12月29日
コメントする
(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)