音楽とお酒とものづくりと

営業マンが元webエンジニアの経験を生かしてあれやこれやするやつ

PHPUnitにDBUnitを拡張してテスト用DBのデータを初期化させてみた

はじめに

テストを実行する際に、テスト用DBのテーブルのレコードをええ感じで初期化したいな〜という思いがありました。"ええ感じで"というのはそんなに深い意味はなくて、研修でwebアプリを作った時は、テスト実行時にDBのテーブルのレコードを初期化するコードをテストファイルの中にごちゃごちゃ書いてやっていたので、もっとスマートにやりたいなーというくらいのニュアンスです。
今回はDBUnitを導入してみました。

ちなみにPHPUnitも公式ドキュメントで

DbUnit を使うと、 データベースのテストにおけるこれらの問題をシンプルにする助けになります。

って言うてるみたいです。

DBUnitの導入

dbunitのインストール

まずはComposerでインストールします

"require": {
    "phpunit/dbunit": ">=1.2"
}

テスト用のクラスに継承させる

そしてテストクラスで

class Hoge_FugaTest extends PHPUnit_Framework_TestCase

と継承していたものを

class Hoge_FugaTest extends PHPUnit_Extensions_Database_TestCase

と書き換えます。

設定用メソッドの実装

次に上記のフレームワークを継承したクラスに以下の2つのメソッドを実装します。
getConnection()はテスト用のDBへ接続情報を与え、getDataset()はDBのテーブルへの初期データの情報を与えます。

    public function getConnection()
    {
        $db = \Database_Connection::instance();
        return $this->createDefaultDBConnection($db->connection(),'testDBname');
    }

    public function getDataSet()
    {
        return $this->createFlatXmlDataset(APPPATH."tests/defaultDataset.xml");
    }

'testDBname’はテスト用のDBの名前を指定するみたいですが、fuelphpでは各開発環境ごとに接続するDBの情報をconfigフォルダで管理しています。一応中の処理も見たのですが、おそらく?dbのDatabase_Connectionのインスタンスを作成する際にそのファイルを読みに行ってくれている?と思われるので、特に指定する必要はなさそうです。試しにtestDBnameを空文字にして試してみましたが、ちゃんと動いてくれました。

なんにせよ、これでテスト実行時にDBのテーブルのレコードを指定した値を用いて初期化してくれるようになりました。

初期データの指定

なお初期データは別のxmlファイルに切りだし、そのファイルのパスを指定してやればOK。
データは以下の様に記述します。

<?xml version="1.0" ?>
 <dataset>
     <users id="1" name="aho" password="ahopass" />
     <users id="2" name="boke" password="bokepass" />
 </dataset>

一点だけ詰まったのが、各フィールドに指定する値は、DBのテーブルで指定した型によらずクォーテーションで囲まないといけない様子。idとかの数値をそのまま書いてたらエラーで怒られました。