phpunit数据库测试,不影响数据库
我使用phpunit已经有几天了,现在我需要测试一个数据库查询。我遵循了phpunit的官方文件,但我认为我遗漏了它背后的主要思想。我实现了两个抽象函数phpunit数据库测试,不影响数据库,php,database,phpunit,Php,Database,Phpunit,我使用phpunit已经有几天了,现在我需要测试一个数据库查询。我遵循了phpunit的官方文件,但我认为我遗漏了它背后的主要思想。我实现了两个抽象函数getConnection和getDataSet,如下所示: /** * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection */ public function getConnection() { $pdo = new PDO('mysql:h
getConnection
和getDataSet
,如下所示:
/**
* @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
*/
public function getConnection()
{
$pdo = new PDO('mysql:host=localhost;dbname=testdb', $this->config['mysql_usr'], $this->config['mysql_pass']);
return $this->createDefaultDBConnection($pdo, 'testdb');
}
/**
* @return PHPUnit_Extensions_Database_DataSet_IDataSet
*/
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__).'/../dbTest/fixtures/data.xml');
}
public function testDeleteRule_legalDeletion()
{
$id = 3;
$pdo = $this->getConnection();
$fixture = new AdRules();
$fixture->setDbh($pdo);
$res = $fixture->deleteRule($id);
$DBH = $fixture->getDbh();
$query = "SELECT * FROM rules WHERE id=3";
$stmt = $DBH->prepare($query);
$stmt->execute();
$rows = $stmt->rowCount();
$this->assertEquals($rows,0);
}
好吧,现在我正在与本地数据库交互,但是为什么我需要创建XML数据集(我需要它而不仅仅是为了比较)?
我发现自己只与数据库中的数据进行交互。
例如,现在我想测试一个从数据库中删除的函数:
function deleteRule($id){
$DBH = $this->getDbh();
$query = "SELECT id from ads where group_id=$id";
$STH = $DBH->query($query);
if ($STH->rowCount() > 0){
throw new Exception("Rule has {$STH->rowCount()} ads, can't delete", 400);
} else {
$query = "DELETE FROM rules WHERE id=:id limit 1";
$stmt = $DBH->prepare($query);
$stmt->execute(array(':id' => $id));
}
}
所以我开始为它编写一些测试,其中一个看起来像这样:
/**
* @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
*/
public function getConnection()
{
$pdo = new PDO('mysql:host=localhost;dbname=testdb', $this->config['mysql_usr'], $this->config['mysql_pass']);
return $this->createDefaultDBConnection($pdo, 'testdb');
}
/**
* @return PHPUnit_Extensions_Database_DataSet_IDataSet
*/
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__).'/../dbTest/fixtures/data.xml');
}
public function testDeleteRule_legalDeletion()
{
$id = 3;
$pdo = $this->getConnection();
$fixture = new AdRules();
$fixture->setDbh($pdo);
$res = $fixture->deleteRule($id);
$DBH = $fixture->getDbh();
$query = "SELECT * FROM rules WHERE id=3";
$stmt = $DBH->prepare($query);
$stmt->execute();
$rows = $stmt->rowCount();
$this->assertEquals($rows,0);
}
但是现在,在从数据库中删除之后,如何将其恢复到初始状态?我知道我可以简单地执行mysql语句,但我猜它忽略了模拟PDO对象和避免数据库中重大更改的所有要点。
无论如何,我对此感到非常困惑,我们将非常感谢您的指导。thx。建议您使用其他数据库进行测试,因为正如您所说,您可以破坏您的生产数据。当您有其他数据库时,您可以使用事务机制来测试您的查询 这是怎么回事
setUp
,在引导中创建的数据库句柄上启动一个新事务testDeleteRule\u legaldelement
)修改数据库内容并断言数据是您所期望的tearDown
方法,该方法回滚事务并清理表(用于测试数据库句柄)DbTransactionalTestCase
,在这个类中,您必须重写方法setUp
和tearDown
如果你对自动化这个过程的框架感兴趣,看看我们是如何做到的。这是你的问题的文件