Allied ArchitectsAllied ArchitectsEngineer Blog

PHPUnitのDBUnit拡張をさらに拡張してみる

2013/01/25 PHP

モニプラ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を用意して使用する想定です。

最後になりますが、
これってわざわざ自分で作らなくても、もっと高機能で便利なライブラリってあるんじゃないの?
と思わない日はありません。

  • 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へ