理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

DBUnit の思想について

DBUnit というと、JUnit 徹底入門だったり、現場で使える Java ライブラリだったりで紹介されていることからも分かるように、それなりにユーザベースも広く、"DB 関連のテストをするにあたってそういうライブラリがある" という認識はわりと多くの方が持たれていると思います。
一方で、DBUnit は一つのフレームワークであって、そのフレームワークが提供する "フレーム"、思想がどういうものなのかはあまり明示的に紹介されていないように思います。ここを間違えてしまうと、せっかくのライブラリ導入、テストコードが無意味になってしまいかねないので、ちょっと記事を起こすことにしました。

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

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

現場で使えるJavaライブラリ

現場で使えるJavaライブラリ

DBUnit の思想

DBUnitJUnit の拡張ライブラリという位置付けで、DB に関わるテストユーティリティ群を提供します。
ユーティリティというと便利な言葉で、これを定義しないとソースに *Util.java なんてものが乱立することになりますが、DBUnit はそのライブラリの思想に沿ったクラス群を提供してくれています。ざっくりと言ってしまうと、その思想は以下の 3 点に集約されるかと思います。特に、2 つ目に記述している DB テストに関する概念の抽象化に成功しているところに、ライブラリとしての価値があると認識しています。

  1. 基本的には、テスト対象はテーブルの全データ、あるいはデータベースの全データである
    • アプリケーション的な観点ではなく、DB のデータという観点でテストを実施することになる
    • 特定カラムのみ比較する、というような機能も持つが、あくまでオマケ程度に思っておいた方が良い
  2. 想定しているのはブラックボックステストであり、それに必要な抽象概念を定義している
    • 特定の入力を与え、処理を行った結果、期待通りの出力になるかをテストする。
    • DBUnit では、ここの処理の実体にはほぼ関与しない
    • 従って、DBUnit では、DB のテストの入力、および出力となるデータセットを如何に抽象化(ITable (dbUnit Extension 2.5.1-SNAPSHOT API)dbUnit Extension 2.5.1-SNAPSHOT API])するか、および、抽象化された個々の実装(IDataSet の実装クラス群)の提供を主眼としている (ように見える)
  3. IDataSet や ITable として抽象化されたデータを、DB に叩き込んだり、比較したりするユーティリティを提供する

また、注意点としては、IDataSet として抽象化されたデータセットの比較 (Assertion)は、基本的に「完全一致」で行われます。これは例えば DbUnitAssert (dbUnit Extension 2.5.1-SNAPSHOT API) には assertEquals から始まる Assertion しかない、ということからも理解できるかと思います。
したがって、「こういうデータセット間の差分は無視したい」というような粒度で制御をする場合には、ちょっと頭を捻らなければなりません。このあたりは別に記事を起こそうと思います。