Allied ArchitectsAllied ArchitectsEngineer Blog

PHPUnitのDBUnit拡張を使ってみる

2012/06/20 PHP

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

前回のエントリでは、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をさらに拡張して、データのロールバックの仕組みや、各テストケース事に異なる初期データをぶち込む仕組みを入れるなどして使い易くする必要があるかと思います。その辺についても書こうかと思いましたが、今回はここまでということで。。

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

  • cobonas
  • プログラマ
  • 元Javaプログラマ。現在はScala/PlayでWeb開発と、SwiftでiOSアプリ開発をしています。 Unitテストとか書いてる時が一番楽しかったりします。

RELATION ENTRY

Play Framework(Play2)(Scala)のTips Part3:Akkaを使った非同期/バッチ処理(Advent Calendar 20日目)

Play Framework(Play2...

2014/12/20 Scala

この記事はアライドアーキテクツAdvent Calendar 20日目の記事です。 どうも。伊藤(係長)です。 今日は他の方に乗っ取られる事もなく無事に書くことができます。 今回はAkkaを使った非同期処理やバッチ処理についてです。 通常、非同期処理をJavaとかで書こうと思ったら、ちょっとメン...

続きを読む

Play Framework(Play2)(Scala)のTips Part2:Specs2とMockitoでテストを書く(Advent Calendar 8日目)

Play Framework(Play2...

2014/12/8 Scala

この記事はアライドアーキテクツAdvent Calendar 8日目の記事です。 どうも。謎の刺客Tarou Yamadaさんにカレンダーを乗っ取られてしまった伊藤(係長)です。 気を取り直して、今回はSpecs2とMockitoを使ったユニットテストのお話を書きます。 ■Specs2とは ...

続きを読む

cobonasの記事一覧へ

ページTOPへ