読者です 読者をやめる 読者になる 読者になる

PHPUnitのDBUnit拡張をPHPUnitの外側で使う

php

DBUnitにはXMLYAMLCSVや任意のSQLを使ってDataSetを定義し、それらをINSERT、DELETE、UPDATE、TRUNCATEする機能があります。

これらの機能をPHPUnitを使わずに呼び出すこともできます。

<?php
require_once "PHPUnit/Extensions/Database/Autoload.php";

$db = new PDO(DSN, DB_USER, DB_PASS);
$con = new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($db);
$tester = new PHPUnit_Extensions_Database_DefaultTester($con);

$tester->setSetUpOperation(PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT());
$tester->setDataSet(
    new PHPUnit_Extensions_Database_DataSet_YamlDataSet(__DIR__ . '/_file/test_data.yaml')
);

$tester->onSetUp();

$tester->onSetUp()を呼び出すと、テーブルをTRUNCATEしてからINSERTします(CLEAN_INSERT)。PHPUnit_Extensions_Database_Operation_Factoryには他にINSERT、TRUNCATE、DELETE、DELETE_ALL、UPDATEがあります。また、PHPUnit_Extensions_Database_Operation_Compositeを使って複数のOperationを組み合わせることもできます。

あと$tester->setTearDownOperation()でセットしたOperationは、$tester->onTearDown()で呼び出すことができます。この辺はたぶんこの本が一番詳しい

Real-World Solutions for Developing High-Quality PHP Frameworks and Applications

Real-World Solutions for Developing High-Quality PHP Frameworks and Applications

DefaultTesterを使わずに呼び出すこともできそうです。

<?php
require_once "PHPUnit/Extensions/Database/Autoload.php";

$db = new PDO(DSN, DB_USER, DB_PASS);
$con = new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($db);
$dataSet = new PHPUnit_Extensions_Database_DataSet_YamlDataSet(__DIR__ . '/_file/test_data.yaml');
$operation = PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT();
$operation->execute($con, $dataSet);