外部モジュールとの連携
テスト・クラスの拡張
今回は、データベースへのアクセスが必要なテストや、未実装のモジュールを補完してテストするなど、外部モジュールとの連携が必要な場合に役立つテスト方法について紹介します。
まず、データベースのテストに入る前に、PHPUnitのテスト・クラスについて振り返ってみます。
これまで作成したテスト・ケースは、すべてPHPUnit_Framework_TestCaseクラスを継承していました。このクラスはPHPUnitの基底テスト・クラスになります。テスト・ケースを実装するには、setUp()メソッドとtearDown()メソッドをオーバー・ライドします。その中でテスト開始前の初期化と、終了後のクリーン・アップ処理を行います。そして、テスト項目ごとにテスト・メソッドにアサーションを定義しました。
このようにテスト・ケースを実装していくにうちに、共通の処理をまとめたり、新たな機能を追加したり、PHPUnit_Framework_TestCaseクラスを拡張していくことが考えられます。実はPHPUnitにも、テストの目的に合わせて機能拡張されたテスト・クラスがあらかじめ用意されています。
例えば、制限時間内に処理が終了することを確認するPHPUnit_Extensions_PerformanceTestCaseクラスや、プログラムが標準出力に書き込んだ内容を確認するPHPUnit_Extensions_OutputTestCaseクラスなどがあります。今回は、その中からデータベースのテストで使用するPHPUnit_Extensions_Database_TestCaseを取り上げます。
<?php require_once 'PHPUnit/Extensions/Database/TestCase.php'; class DatabaseTest extends PHPUnit_Extensions_Database_TestCase { protected function getConnection() { $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); return $this->createDefaultDBConnection($pdo, 'test'); } protected function getDataSet() { return $this->createFlatXMLDataSet(dirname(__FILE__).'/book-seed.xml'); } public function testInitDataSet() { $dataset = $this->getDataSet(); $this->assertDataSetsEqual( $dataset, $this->getConnection()->createDataSet(), "データセットの初期化エラー" ); } } ?> |
図1:サンプル・コード(DatabaseTest.php) |
PHPUnit_Extensions_Database_TestCaseクラス
このテスト・クラスは、JUnitにおけるDbUnitがベースになっています。テストを実行する前に、用意してあるデータ・セットを使ってテーブルを初期化するので、データの不整合によってテスト結果が変わってしまうことを気にする必要がありません。また、データベースとの接続はPDO(PHP Data Objects: http://php.net/manual/ja/book.pdo.php)によって抽象化されているので、MySQL、PostgreSQL、Oracleなどさまざまなデータベースに接続できます。
まずは、使い方をイメージするためにサンプル・コード(図1)を見てみます。
次のページで、このサンプル・コードの処理内容と、テストの実行方法について説明します。