現在はテスト自動化シリーズと題しまして、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ファイルをダウンロードし、インポートして下さい。
- DbUnit(2.4.9)
これにてライブラリのセットアップは完了、と思いきや、ここで罠があります。
このまま先に進んでしまうと、後で「java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory」とかエラーが出てきてしまいますのでご注意を。
内部で「slf4j」を使っているようですので、これもダウンロードしてインポートしましょう。
- SLF4J(1.7.5)
中には沢山のjarファイルが入っていますが、以下をインポートすればOKです。
- slf4j-api-1.7.5.jar
- slf4j-nop-1.7.5.jar
これにてjarファイルの準備完了。
最終的に、以下のようにjarファイルが揃っていればOKです。
DB準備
データベースのテストですので、当然ながらデータベース、テーブル、カラムが定義されており、そのテーブルに対し登録、更新、削除、参照の機能が作成済みの状態でなければ開始出来ません。この記事では以下の環境でご紹介します。
- PostgreSQL 9.1
- SaStrutsやHibernateといったライブラリは使用せず、postgres標準ドライバのみで機能を作成済み
テーブルとしては簡単な「商品テーブル」を想定して以下を定義します。
物理名 | 論理名 | 型 |
---|---|---|
id | ID | serial(主キー) |
shohin_name | 商品名 | text |
price | 価格 | integer |
create_at | 登録日時 | timestamp without time zone |
update_at | 更新日時 | timestamp without time zone |
- IDは自動インクリメントするパラメータです。
- 商品名と価格は特記事項の無し。
- 登録日時、更新日時は、それぞれ「登録」「更新」を行った時に、その時の時間が入るという想定です。
終わりに
これにて準備は整いました。実際にDbUnitを使ってのご紹介は次回からスタートします。
0 件のコメント:
コメントを投稿