Help us understand the problem. What is going on with this article?

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>
cobonas
forcas
『FORCAS(フォーカス)』は、データ分析に基づいて成約確度の高いアカウントを予測し、マーケティングと営業のリソースをそのターゲットアカウントに集中する最新マーケティング手法「Account Based Marketing (ABM) 」の実践を強力にサポートするマーケティングプラットフォームを開発・提供してます。
https://www.forcas.com/overview/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした