每次测试前需要使用PHPUnit&;清除多个数据库;数据库单元

每次测试前需要使用PHPUnit&;清除多个数据库;数据库单元,phpunit,dbunit,Phpunit,Dbunit,我正在为我们的系统编写测试,该系统跨多个数据库进行连接。我选择将MySQL用于我的测试数据库,即test_database1和test_database2,我通过将生产模式转储到相应的表中来创建它们。注意,此时我不需要任何数据,只需要模式 在运行测试之前,清除这些数据库的最佳方法是什么?我有两个要求: 有一些外键约束阻止我仅仅能够截断,所以我需要“手动”清除每个表 我需要清除两个数据库 我研究了以下方面: class PHPUnit_Extensions_Database_Operation_T

我正在为我们的系统编写测试,该系统跨多个数据库进行连接。我选择将MySQL用于我的测试数据库,即test_database1和test_database2,我通过将生产模式转储到相应的表中来创建它们。注意,此时我不需要任何数据,只需要模式

在运行测试之前,清除这些数据库的最佳方法是什么?我有两个要求:

  • 有一些外键约束阻止我仅仅能够截断,所以我需要“手动”清除每个表
  • 我需要清除两个数据库
  • 我研究了以下方面:

    class PHPUnit_Extensions_Database_Operation_Truncate implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
    
    在DbUnit中,但它似乎依赖于数据集内容,在我的例子中,数据集内容将是空的,因为我通过mysqldump预加载了模式——没有数据


    有任何指针吗?

    您可以创建一个实用程序函数来重建数据库,该函数可以在需要干净数据库的测试之前调用,也可以在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命令仅为演示目的而编写,尚未对确切的开关/参数进行测试。

    我使用标准PHPUnit_DatabaseTestCase和fixture进行测试
    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

    当运行这个命令时,终端每次都会提示输入密码。还有什么方法可以避免这种情况吗?您需要将上面命令中的字符串
    someuser
    password
    替换为具有适当权限的用户的凭据,以便删除和创建数据库。是的,已经这样做了,但不起作用。每次我都必须重新输入密码。是否每次调用重建方法时都会提示您输入密码4次?