cobonas

2012.06.20

PHPUnitのDBUnit拡張を使ってみる

アライドアーキテクツの伊藤です。

前回のエントリでは、PHPUnit系のお話を書きましたが、今回もしつこくPHPUnit系のお話を書きます。PHPUnitでテストを書いている時、データベースへの接続が発生するようなテストがあった場合、皆さんはどうしてますでしょうか。

レガシーコード改善ガイドによれば、データベース接続を伴う単体テストはあまり望ましくない為、データベース接続を伴うクラス、メソッドとの依存関係を排除して単体テストを書くべきとあります。

僕もそれが本来あるべき姿だと思いますが、今回はその話は一旦横に置いておき、PHPUnit上で使えるDBUnit拡張について書かせて頂きます。

使い方

通常のテストクラスは「PHPUnit_Framework_TestCase」を継承して作りますが、DBUnitを使う場合は「PHPUnit_Extensions_Database_TestCase」を継承して、さらにabstract functionの「getConnection」と「getDataSet」を実装します。

↓こんな感じで↓

getConnectionで使用するデータベース情報、getDataSetで初期データをぶち込んでいます。sample.xmlは次のようなXMLファイルです。

このように記述すると、テストメソッドが実行される前にsampleテーブルにレコードが2行追加されます。

試しに、ちゃんと初期データが追加されているかどうかを確認する為、次のようなテストを書いてみます。

テストはちゃんと全て通ります。ちなみに3番目のassertは予め用意した期待値用XMLを利用しています。sample_expected.xmlの内容はこんな感じです。

まとめ

このようにDBUnit拡張を使うと、簡単に初期データの投入や、予め用意されているfunctionや仕組みを使って、データの検証ができます。便利ですね〜。実際に使用する場合は、PHPUnit_Extensions_Database_TestCaseをさらに拡張して、データのロールバックの仕組みや、各テストケース事に異なる初期データをぶち込む仕組みを入れるなどして使い易くする必要があるかと思います。その辺についても書こうかと思いましたが、今回はここまでということで。。

アライドアーキテクツでは、一緒に働く単体テスト好きな仲間を随時募集しています。是非一度採用サイトを覗いてみてください。