2013年7月18日木曜日

データベースのテスト支援ツール DbUnit その1 インストール編

株式会社ジェニシス 技術開発事業部の遠藤 太志郎(Tacy)です。

現在はテスト自動化シリーズと題しまして、JUnit関連のご紹介を執筆しています。
今回からはデータベースのテスト支援ツール「DbUnit」のご紹介になります。

さて、JUnitの開発で発生しがちなのが「環境依存」です。

  • あの時は正常に動いたのに、今は動かない。
  • Aさんが動かすと正常なのに、Bさんが動かすと動かない。

といったことが結構頻繁に起こりがちです。

原因としましては、

  • データベースが完璧にセットアップされている時だけ正常。ゴミレコードが入っているとNGになる。
  • AさんのPCには動作に必要なファイルが置いてある。BさんのPCには無い。(ソースを書いたのがAさんだから)

など、「動かなくて当たり前」な原因であることが殆どです。

前提条件となる環境が整備されていなくてはプログラムが動かないのは当たり前です。
しかし、その環境整備が結構面倒であるのも無視できない事実。
面倒だから後回しにしているうちに品質が低下していく、というのがJUnit開発の良くある風景です。

面倒な環境整備を簡単に済ませるのも技術力の一つ!!
というわけで、この連載では環境整備を簡単にするテクニックもテーマに掲げたいと思います。

しかし、環境整備と言っても条件は様々です。

  • データベースのレコードのセットアップ状態
  • 読み書きするファイルの状態
  • プログラムを実行するサーバの状態(読み取り権限、書き込み権限など)
  • 接続先サーバの状態(FTPサーバにファイルがある/無いなど)

色々あります。
それぞれ「スタブやモック」を使ったり「ダミーサーバ」を作ったりと色々なテクニックがあるのですが、今回からしばらくはこのうちの一つ、「データベースのセットアップ」並びに「登録後のレコードの照合」の作業を効率化する支援ツール「DbUnit」についてご紹介しようと思います。

プロジェクト構築

最初はプロジェクト構築からです。
以下の単位でソースフォルダを切ります。

ソースフォルダ役割
メインソーステスト対象となるメインのJavaソースを置く場所
メインリソースプロパティファイルなど、ソースから読み込みに使用する定義ファイルなどを置く場所
テストソースJUnitのソースを置き場所
テストリソースJUnitで使用する定義ファイルを置く場所


ここで早くも重要点ですが、プロジェクト開始時にこの粒度でソースフォルダを切って下さい。
もちろん、ソースフォルダなどどんな構成でもモジュールは動くわけですが、
プログラムの見通しを良くするという観点では、この粒度での切り分けが鉄板だと言い切ってしまって良いと思います。

ライブラリインポート


次にライブラリのインポートです。

以前の記事でご紹介したように、まずはJUnitの最新ライブラリを公式サイトよりダウンロードしてきます。
(Eclipseの自動機能でインポートすると、古いJUnitが入ってきたり、hamcrestが入ってなかったりするので、手動でインポートすることを忘れないで下さい)


次にDbUnitのライブラリをインポートします。
DbUnitは名前のとおり、JUnitを拡張したライブラリですので、JUnitとセットで使うことになります。
DbUnitの公式サイトからjarファイルをダウンロードし、インポートして下さい。


これにてライブラリのセットアップは完了、と思いきや、ここで罠があります。
このまま先に進んでしまうと、後で「java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory」とかエラーが出てきてしまいますのでご注意を。
内部で「slf4j」を使っているようですので、これもダウンロードしてインポートしましょう。



中には沢山のjarファイルが入っていますが、以下をインポートすればOKです。


  • slf4j-api-1.7.5.jar
  • slf4j-nop-1.7.5.jar


これにてjarファイルの準備完了。
最終的に、以下のようにjarファイルが揃っていればOKです。


DB準備

データベースのテストですので、当然ながらデータベース、テーブル、カラムが定義されており、そのテーブルに対し登録、更新、削除、参照の機能が作成済みの状態でなければ開始出来ません。

この記事では以下の環境でご紹介します。


  • PostgreSQL 9.1
  • SaStrutsやHibernateといったライブラリは使用せず、postgres標準ドライバのみで機能を作成済み


テーブルとしては簡単な「商品テーブル」を想定して以下を定義します。


物理名論理名
idIDserial(主キー)
shohin_name商品名text
price価格integer
create_at登録日時timestamp without time zone
update_at更新日時timestamp without time zone


  • IDは自動インクリメントするパラメータです。
  • 商品名と価格は特記事項の無し。
  • 登録日時、更新日時は、それぞれ「登録」「更新」を行った時に、その時の時間が入るという想定です。

終わりに

これにて準備は整いました。
実際にDbUnitを使ってのご紹介は次回からスタートします。

0 件のコメント:

コメントを投稿