PHPUnitとDbUnitを使用して各テストを行う前に複数のデータベースをクリアする必要がある

私は、複数のデータベースにまたがってジョインする私たちのシステムのテストを書いています。私はテストデータベース、つまりtest_database1とtest_database2にMySQLを使用することを選択しました。これはそれぞれのテーブルにプロダクションスキーマをダンプして作成します。私はこの時点ではデータは必要なく、スキーマのみが必要であることに注意してください。

テストを実行する前にこれらのデータベースをクリアするにはどうすればよいでしょうか?私は2つの要件があります:

  1. 私がTRUNCATEできないようにするいくつかの外部キーの制約があるので、各テーブルを "手動で"削除する必要があります。
  2. 両方のデータベースをクリアする必要があります。

私はオーバーライドを検討した:

class PHPUnit_Extensions_Database_Operation_Truncate implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation

DbUnitではデータセットの内容に依存しているようですが、mysqldump --no-dataを介して自分のスキーマをプリロードするので、私の場合は空になります。

すべてのポインタ?

0

3 答え

私はより良い解決策を見つけました 外部キーチェックを0に設定する

1
追加された

クリーンなデータベースやsetUp()関数を必要とするテストの前に呼び出すことができるデータベースを再構築するユーティリティ関数を作成することができます:

class DbUtil {

    public static function rebuild($src, $dest) {
        exec("mysql -u someuser -p password -e 'DROP DATABASE $dest'");
        exec("mysql -u someuser -p password -e 'CREATE DATABASE $dest'");
        exec("mysqldump -d -u someuser -p password $src > MySQL -u someuser -p password $dest");
    }
}

class MyTest extends PHPUnit_Framework_TestCase {

    protected function setUp() {
        DbUtil::rebuild('prod_database1', 'test_database1');
        DbUtil::rebuild('prod_database2', 'test_database2');
    }

   //...
}

これは最も実践的なアプローチではないかもしれませんが、すべてのテストできれいなデータベースが得られます。

テストのためにMySQLからやり直すことができたら、テンプレートsqliteデータベースファイルを作成し、そのファイルをテストのために別の場所にコピーすることに成功しました。各テストは、クリーンなテンプレートファイルでテストデータベースファイルを上書きします。

注:Execコマンドはデモンストレーションの目的でのみ記述されており、正確なスイッチ/パラメータについてはテストされていません。

0
追加された
上記のコマンドの someuser および password の文字列をDROPおよびCREATEデータベースに適切な権限を持つユーザーの資格情報に置き換える必要があります。
追加された 著者 pgraham,
再構築メソッドが呼び出されるたびにパスワードを4回入力するよう促しますか?
追加された 著者 pgraham,
このコマンドを実行すると、端末は毎回パスワードの入力を求めます。あまりにもそれを回避する方法はありますか?
追加された 著者 Gihan De Silva,
はい、すでにそれを行った、それは動作しませんでした。パスワードを再入力する度に
追加された 著者 Gihan De Silva,
はい、そうです.. :(
追加された 著者 Gihan De Silva,

私は標準のPHPUnit_DatabaseTestCaseを使用してそれを行います

protected $_connectionMock;
protected $_secondDbConnectionMock;

protected $backupGlobalsBlacklist = array('application'); //btw this hack will speed up your tests

/**
 * @return Zend_Test_PHPUnit_Db_Connection
 */
protected function getConnection()
{
    if ($this->_connectionMock == null) {
        $multiDb = Zend_Registry::get('multidb');

        $connection = $multiDb->getDb();

        $this->_connectionMock = $this->createZendDbConnection(
            $connection, ''
        );

        Zend_Db_Table_Abstract::setDefaultAdapter($connection);
    }
    return $this->_connectionMock;
}

protected function getSecondDbConnection()
{
    if ($this->_dnsConnectionMock == null) {
        $multiDb = Zend_Registry::get('multidb');

        $connection = $multiDb->getDb('second_db');

        $this->_secondDbConnectionMock = $this->createZendDbConnection(
            $connection, ''
        );
    }

    return $this->_dnsConnectionMock;
}

protected function setUp()
{
    parent::setUp();

    $this->databaseTester = NULL;

    $this->getDatabaseTester()->setSetUpOperation($this->getSetUpOperation());
    $this->getDatabaseTester()->setDataSet($this->getDataSet());
    $this->getDatabaseTester()->onSetUp();

    $secondDataSet = $this->getDataSetForSecondDb();
    if ($dnsDataSet) {
       //create data set for second db
        $secondDataTester = new PHPUnit_Extensions_Database_DefaultTester($this->getSecondDbConnection());
        $secondDataTester->setSetUpOperation($this->getSetUpOperation());
        $secondDataTester->setDataSet($secondDataSet);
        $secondDataTester->onSetUp();
    }

}

protected function getDataSetForSecondDb()
{
    return null;
}

}

私はmultidbを使うためにそれを拡張しました

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com