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