
モニプラFacebook担当の伊藤です。
以前、PHPUnitのDBUnit拡張を使ってみるというエントリを書きましたが、その中で、
実際に使用する場合は、PHPUnit_Extensions_Database_TestCaseをさらに拡張して、データのロールバックの仕組みや、各テストケース事に異なる初期データをぶち込む仕組みを入れるなどして使い易くする必要があるかと思います。
その辺についても書こうかと思いましたが、今回はここまでということで。。
と書いておきながら、かれこれ7ヶ月も放置してしまいました。というワケで今回はこのテーマについてです。
早速ですが、上記の
・データのロールバックの仕組み
・各テストケース事に異なる初期データをぶち込む仕組み
を実現するクラスを書いてみたのでコードをさらします。
※実際に動作する事は確認済みですが、まだまだ粗いと思いますのでその辺は気にしないで下さい。
では、各functionについて軽〜く説明です。
1. initDB()
初期化処理。
第1引数にテストの前提条件となるdataSetを指定。
第2引数にバックアップ&リストアしたいテーブル名を指定。
動きとしては、次のようになります。
①テスト実行前に、第2引数に指定したテーブルがバックアップされる
②dataSetに指定したレコードがINSERTされる
③テスト終了後に、バックアップしたテーブルが元に戻される
2. getConnection()
必ずOverrideが必要。DB接続情報を保持したDatabaseConnectionを返す。
接続情報は別ファイルに定義してある。
3. getPdoConnection()
PDOを直接操作したかったので定義。
4. getDataSet()
必ずOverrideが必要。
5. getRestoreDataSet()
リストアするdataSetを返す。
6. getTearDownOperation()
親functionをOverride。デフォルトではtearDown時はNONE(何もしない)が指定されているので、
リストアする為にCLEAN_INSERTを指定。
7. tearDown()
親functionをOverride。リストアする為。
8. getDataFilePath()
関係なし。
実際の使い方です。
テストが終了した後に自動的にDBがリストアされます。
(※テスト中にシンタックスエラーなど変な落ち方をした場合はリストアされません。ご注意を。)
冒頭でも言いましたが、これ、確かにちゃんと動作するのですが、
大量レコードがあるテーブルのバックアップは無理です。(検証はしてませんが)
なので、開発用DBとは別に、必要最低限のマスタなどをぶっ込んだDBUnit用のDBを用意して使用する想定です。
最後になりますが、
これってわざわざ自分で作らなくても、もっと高機能で便利なライブラリってあるんじゃないの?
と思わない日はありません。
元Javaプログラマ。現在はScala/PlayでWeb開発と、SwiftでiOSアプリ開発をしています。 Unitテストとか書いてる時が一番楽しかったりします。