8
9

More than 5 years have passed since last update.

PHPUnitのDBUnit拡張

Last updated at Posted at 2012-07-13

弊社ブログからの転載(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>
8
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9