Необходимо очистить несколько баз данных перед каждым тестом, используя PHPUnit & DbUnit - PullRequest
0 голосов
/ 24 ноября 2011

Я пишу тесты для нашей системы, которая объединяет несколько баз данных.Я решил использовать MySQL для моих тестовых баз данных, то есть test_database1 и test_database2, которые я создаю, выгружая свои производственные схемы в соответствующие таблицы.Обратите внимание, что на данный момент мне не нужны никакие данные, только схемы.

Каков наилучший способ очистки этих баз данных перед выполнением теста?У меня есть два требования:

  1. Существуют некоторые ограничения внешнего ключа, которые мешают мне просто иметь возможность TRUNCATE, поэтому мне нужно очистить каждую таблицу «вручную».
  2. Мне нужны обабазы данных очищены.

Я рассмотрел переопределение:

class PHPUnit_Extensions_Database_Operation_Truncate implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation

в DbUnit, но, похоже, он полагается на содержимое DataSet, которое в моем случае будет пустым, так как я предварительно загружаю свою схемучерез mysqldump --no-data.

Есть ли указатели?

Ответы [ 3 ]

0 голосов
/ 19 апреля 2012

Я делаю это, используя стандартный 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 голосов
/ 13 июля 2013

Я нашел лучшее решение здесь установите проверки внешних ключей на 0

0 голосов
/ 25 ноября 2011

Вы можете создать служебную функцию, которая перестраивает базу данных, которую можно вызывать перед тестами, которые требуют чистой базы данных, или с помощью функции 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 написана только для демонстрационных целей и не была проверена на точные параметры / параметры.

...