Edited at

PHPUnitのDBUnit拡張

More than 5 years have passed since last update.

弊社ブログからの転載(http://tech.aainc.co.jp/archives/1314)

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

↓こんな感じで↓

class SampleDBTest extends PHPUnit_Extensions_Database_TestCase {

public function getConnection() {
$pdo = new PDO('mysql:host=192.168.***.***; dbname=test', 'user', 'password');
return $this->createDefaultDBConnection($pdo);
}

public function getDataSet() {
return $this->createXMLDataSet(dirname(__FILE__) . '/../data/sample.xml');
}
}

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

<?xml version="1.0" encoding="UTF-8"?>

<dataset>
<table name="sample">
<column>id</column>
<column>name</column>
<column>telephone</column>
<row>
<value>1</value>
<value>itoh</value>
<value>03-****-****</value>
</row>
<row>
<value>2</value>
<value>katoh</value>
<value>04-****-****</value>
</row>
</table>
</dataset>

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

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

/** @test */

public function 初期データがちゃんとロードされているかテスト() {

// 事前データが作成されて、実際のDBのテーブルの件数が2件であること
$this->assertEquals(2, $this->getConnection()->getRowCount('sample'));

// 事前データが作成されて、実際のDBからSQLで取得したテーブルの内容と事前データのテーブルの内容が同一であること
$sql = 'SELECT id, name, telephone FROM sample';
$this->assertTablesEqual($this->getDataSet('sample')->getTable('sample'), $this->getConnection()->createQueryTable('sample', $sql));

// 事前データが作成されて、実際のDBからSQLで取得したテーブルの内容と予め用意した期待値用xmlで生成したテーブルの内容が同一であること
$sql = 'SELECT name, telephone FROM sample';
$this->assertTablesEqual($this->createXMLDataSet(dirname(__FILE__) . '/../data/sample_expected.xml')->getTable('sample'), $this->getConnection()->createQueryTable('sample', $sql));

// 事前データが作成されて、実際のDBからSQLで取得したデータセットの内容と事前データのデータセットの内容が同一であること
$this->assertDataSetsEqual($this->getDataSet('sample'), $this->getConnection()->createDataSet(array('sample')));
}

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

<?xml version="1.0" encoding="UTF-8"?>

<dataset>
<table name="sample">
<column>name</column>
<column>telephone</column>
<row>
<value>itoh</value>
<value>03-****-****</value>
</row>
<row>
<value>katoh</value>
<value>04-****-****</value>
</row>
</table>
</dataset>