gpt4 book ai didi

不影响数据库的phpunit数据库测试

转载 作者:搜寻专家 更新时间:2023-10-31 20:37:16 25 4
gpt4 key购买 nike

我已经使用 phpunit 几天了,到了需要测试数据库查询的地步。我遵循了 phpunit 官方文档,但我认为我错过了它背后的主要思想。我像这样实现了两个抽象函数 getConnectiongetDataSet:

  /**
* @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');
}

好吧,现在我正在与我的本地数据库进行交互,但是为什么我需要创建 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));
}
}

所以我开始为它编写一些测试,其中一个看起来像这样:

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。

最佳答案

建议使用其他数据库进行测试,因为你可以像你说的那样破坏你的生产数据。当您有其他数据库时,您可以使用事务机制来测试您的查询。

这是如何运作的?

  1. 在 Bootstrap 测试中,您应该连接到您的测试数据库
  2. PHPUnit 调用 setUp 在 Bootstrap 中创建的数据库句柄上启动新事务
  3. 然后在您的测试用例 (testDeleteRule_legalDeletion) 中修改数据库内容并断言数据符合您的预期
  4. PHPUnit 调用 tearDown 方法来回滚事务并清理表(用于测试数据库句柄)

因此,对于这些操作,您可能需要一些通用的数据库测试用例,例如DbTransactionalTestCase 并且在此类中,您必须重写方法 setUptearDown

附言。如果您对自动执行此过程的框架感兴趣,请查看我们如何在 Ouzo Framework 中进行操作. Here是您问题的文档。

关于不影响数据库的phpunit数据库测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32070501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com