content【超初心者向け】DBUnit超入門JavaunittestDBUnitはじめに今回は、プログラム開発では大活躍!単体テストで使用できるフレームワーク、「DBUnit」の使い方を紹介します。DBUnitとは、Javaで使用するテスティングフレームワークの一つなのですが、筆者が勉強した感じでは、記事が古かったり、それだけで完全に事足りるwebが少ないように見受けられたので、筆者の備忘と、この記事をご覧いただいた方への共有も兼ねて、こちらにまとめておきます。DBUnitとは先にも記載しましたが、DBUnitとは、Javaプログラムのテスティングフレームワークの一つです。テスティングフレームワークと聞くと、XUnitを想像されるかと思います。今回の対象はJavaで実装したプログラムですから、よく使用するのはJUnitですが、DBUnitもJUnitと一緒に使います。JUnitでは、プログラム中に処理したメソッドの戻り値や、引き渡したパラメータに対してチェックを行うことができますが、DBUnitでは、DBに更新した値に対してチェックを行うことができます。その他に、テスト開始前に、DBにテストデータを積み込んだりすることもできます。その存在自体を知らない人も少なくないようなのですが、使いこなせれば、単体テスト(以下、UT)が格段に「楽に、正確に」なりますので、ご興味があれば是非この記事を最後までご覧ください。テストプロジェクトの構築まずは、DBUnitのテストに使用するテストプロジェクトを構築します。テスティングフレームワークのテストというのも、少しおかしい気もしますが、その辺は気にしないで行きます。筆者は以前、Mavenの勉強をして、今Mavenを推しているので、今回のテストプロジェクトは、MavenとEclipseを使用して構築します。Mavenプロジェクトの構築は、以前筆者が記載した、こちらの記事を参考にしていただけると幸いです。プロジェクト名と構成は任意に変更してください。今回筆者は「dbunit-test」とし、以下のライブラリを依存関係として追加ました。プロジェクトツリーと、pom.xmlの設定内容を記載しておきます。今回DBにはOracleを使用するので、JDBCドライバはOracleのものを使用します。OracleのJDBCドライバはMavenのセントラルリポジトリにはないので、ローカルリポジトリにインストールしてあるものを使用します。最後に参考として記載します。</build></project>今回この記事ではMavenを使用していますが、JUnitとDBUnitさえビルドパスに追加しておけば、Mavenである必要はりません。JUnitはEclipseのプラグインでも構いませんので、お好みに合わせてプロジェクト設定は変更してください。テスト用テーブルの構築テストプログラムで実装するテスト用テーブルを構築します。今回は、Oracleインストール時に自動で生成してくれるDBと伝統のSCOTTユーザを使用します。使用するテーブルも、教科書などでおなじみ、EMPテーブルです。Oracleインストール時にデフォルトをで構築している場合は、初めから自動で作成されていますが、テーブルのDDLを記載しておきます。NUMBER);テーブルは構築しますが、今回はDBUnitとしてテストデータを積み込みたいので、テーブルは空のままにしておいてください。テストプログラムの実装プロジェクトのスケルトンを構築したところで、テストプログラムを実装します。サンプル程度なので、1テーブルのレコードをUPDATEするだけのプログラムです。テスト対象プログラムの実装テスト対象とするサンプルプログラムは、「TestMain.java」です。テスト用プログラムでは、logbackを使用していますが、こちらはおまけなので、使用する必要はありません。logbackを使用すれば、DBUnitのデバッグログが見られるので、結構便利です。DBUnitテストのmainを持つクラス。DBUnitテストソースの実装ここからが本番です。JUnitとDBUnitを使用したテストソースを実装します。実装対象は「TestMainTest.class」です。テストプログラムの内容を記載します。ここでは前処理でテストデータの積み込みを、テストメソッドで結果データの検証をしていますが、それぞれのデータの内容は後述します。JUnitとDBUnitを使用してテストを行う。DBに事前データを準備する。テスト後の後処理を行う。DBUnitの後片付けを行う。DBUnitを使用して、DBの更新結果を検証する。DBUnitによるテスト開始。fail("予期しないエラーでテストが失敗しました。DBUnitによるテスト開始。準備データの積み込みDBUnitを使用して事前準備データを積み込みます。事前準備データも、結果検証用データも、どちらの定義もXMLを使用します。筆者はXMLが大嫌いなので、このような類のものは基本的にはExcelとかCSVとかで作りたいところなのですが、CSVでは1ファイル1テーブルしか定義できない、Excelではシート名がテーブル名に対して長さが足りないなど、どうしようもなく不便な要素があるので、DBUnitのテストデータはXMLを使用します。事前準備データと、結果検証用データのXMLの内容を記載します。事前準備データは「Before.xml」、結果検証用データは「After.xml」です。日付は検証対象外だが一応記載します。フィルターできていることを検証するために、わざと違う日付を入力しておきます。/></dataset>上記ではDATE型の日時は固定にしていますが、SYSDATEのように、現在日時をセットすることも可能です。その場合は、こちらが参考になりますのでご覧下さい。テストプログラムの実行さて、ここまでで準備作業を終えましたので、テスト用のプログラムを動かしてみようと思います。DBの変化を見たいので、実行前の状態は記録しておきましょう。実行前のテーブルは、レコードが空の状態です。レコードが入っていても構わないのですが、いったんわかりやすくからの状態からスタートします。テストの実行では、テストを実行します。構築したプロジェクトを、JUnitテストとして実行してください。結果は次のように、エラーはなく正常に終了したことと思います。DBUnitによるテストが構築→実行できました。今回は事前準備データも結果データも一つしか用意していませんが、複数のデータを用意し、テストごとに読み込むXMLを変えれば、テストケースごとに新しいデータを自動的に積み込んで、期待した結果を自動で検証することができます。DBUnitで自動テストを行う方法を紹介してきましたが、いかがでしょうか?必ずしも自動テストがよいかと問われれば、そういうわけではありませんが、何度もテストをやり直したり、何度もテスト結果を取り直したりするのって、結構面倒なので、テストが自動化できるのは、多くの場合では、大きなメリットとなることと思います。ここまでは、駆け足でDBUnitを実行することだけを説明してきましたが、ここからは、実行したテストをステップごとに分解していきます。具体的には、次のステップに分解し、それぞれのステップで、プログラムの動きと、DBの状態を見ていきます。事前準備データの積み込みテスト対象プログラム中の状態テスト結果の検証では、Eclipse上でデバッグ実行しつつ、テストプログラムの動きを見ていきましょう。事前準備データの積み込みまずは、DBUnitによる事前準備データの積み込み時の動きを確認しましょう。実行前状態テーブルは、いったん空の状態戻してあります。Before.xmlから読み込んだデータがきっちり入っていることがお分かりいただけるかと思います。テスト対象プログラムは処理中にDBをUPDATEしているので、レコードが入っていないとうまく動作しない母図なのですが、この前処理でレコードが挿入されていず状態で開始するので正常に動作するわけです。テストプログラム中の状態テストプログラム実行中の状態を見てみましょう。前処理で更新対象のレコードが挿入されているので、UPDATEは正常に実行を終了し、DBの状態が変わっていることが見て取れるかと思います。最後にテスト結果の検証を見てみましょう。DBの状態が期待通りになっているので、DBUnitのアサーションにより、テストを失敗することはなく、アサーションの処理を正常に実行しています。アサーション実行後の最終結果は、先に記載した通りです。最後に長くなった今回の記事も、これで最後です。ここまで長くにわたり、DBunitについて紹介してきましたが、いかがでしょうか?DBUnitは、単体テストを自動化するためのツールですが、うまく使えば単体テスト以外でも、テストデータの積み込みができたり、いろいろと便利なツールになります。便利な反面、結構手間もかかるので、いつでも使えるものではありません。今回の記事ではテストデータが一つしかなかったので、それほど手間ではありませんでしたが、準備しなければならないテーブルがたくさんあったり、一気にたくさんのレコードを処理するようなプログラムだと、検証を自動化しようにも、膨大な量のテストデータを準備しなければならないので、相当な手間です。そのことも踏まえたうえで、うまく使っていただければ、筆者としてそれほどにうれしいことはありません。今回の記事では直接記載しなかった、参考を記載します。記事執筆にあたり、次のWebを参考にしました。記事を記載しくださった管理人、作者の皆様、ありがとうございます。ベル@tarosa0001tarosa0001です。いろんなところに散らばっている技術的ノウハウを、勉強したついでに集めて記載していきます。upLoginユーザーは見つかりませんでした。