PHPUnit数据库测试,不影响数据库

3

我现在使用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对象和避免对数据库进行重大更改的所有要点。无论如何,我很困惑,非常感谢任何指导。

1个回答

3
建议使用其他数据库进行测试,因为您可能会破坏生产数据。当您有其他数据库时,可以使用事务机制来测试查询。
这是如何工作的?
1. 在引导测试中,您应连接到测试数据库 2. PHPUnit调用setUp,在引导中创建的数据库句柄上启动新事务 3. 然后在您的测试用例(testDeleteRule_legalDeletion)中修改数据库内容并断言数据是否符合预期 4. PHPUnit调用tearDown方法回滚事务并清除表格(对于测试数据库句柄)
因此,对于这些操作,您可能需要一些通用的数据库测试用例,例如DbTransactionalTestCase,在此类中,您必须重写setUptearDown方法。
PS. 如果您对自动化此过程的框架感兴趣,请查看我们在Ouzo Framework中的做法。 这里是您的问题的文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接