2013-06-30 47 views
2

我有一个使用Doctrine 2的Zend Framework应用程序(版本1.11)。我已经设置了PHPUnit来对我的模型和表单以及其他类型运行测试。测试效果很好,但有一个问题:一旦测试完成,他们会将测试数据留在数据库中。下面是我的一个测试的基本样本:PHPUnit:如何在测试完成后从我的数据库中删除测试数据?

class VisaTypeEntityTest extends ModelTestCase 
{ 
    public function testCanSaveAndRetrieveVisaType() 
    { 
     $addVisaType = new \Entities\VisaTypes(); 
     $addVisaType->setEnglishName('Test Visa Type') 
      ->setJapaneseName('試し') 
      ->setKanaName('タメシ') 
      ->setDescription('Description of the test visa type'); 

     $this->em->persist($addVisaType); 
     $this->em->flush(); 

     $getVisaType = $this->em->getRepository('\Entities\VisaTypes') 
      ->findOneByEnglishName('Test Visa Type'); 

     $this->assertEquals('Test Visa Type', $getVisaType->getEnglishName()); 
    } 
} 

显然该数据是为了确保一切犹太实际上被输入到数据库中。但我不希望每次运行测试时都将所有测试数据都粘贴到数据库中,我也不想去手动删除它。

有什么我可以做的,比如使用tearDown()方法在测试完成后摆脱测试数据?如果是这样,是否有可能将表格id域中的自动增量“回滚”到他们之前的值?我知道如果id之间存在差距真的不重要,但是如果有某种方式可以让Doctrine重置自动增量值,那将是非常好的。

+0

您正在使用哪个数据库? MySQL的?如果是这样,哪个存储引擎? MyISAM或InnoDB? –

+0

MySql数据库,InnoDb存储引擎。 – blainarmstrong

回答

5

1.关于“清理”:

因为你正使用InnoDB可以使用交易数据库恢复到相同的状态,因为它是在测试前开始:

所以setUp()您将添加$this->em->getConnection()->beginTransaction();tearDown()$this->em->getConnection()->rollback();这会将数据库恢复到以前的状态。还可以查看关于“The InnoDB Transaction Model and Locking”的MySQL手册,以确保这不会干扰应用程序中的任何其他数据(关键字:隔离级别)。

2.关于回滚自动递增的ID:

据我知道这是不是(容易)成为可能。 There is a thread about it on SO其中声明您的应用程序不应该在乎自动增量ID之间是否存在间隙。如果您正在使用测试数据库(建议使用高度),那么这应该是一个较小的问题。

+0

这很有道理。谢谢! – blainarmstrong

+0

现在另一个问题:使用测试数据库的最佳方式是什么?是否有某种功能可以创建当前数据库的“镜像”进行测试,还是需要我自己创建一个? – blainarmstrong

+1

有几种选择,很大程度上取决于数据的类型和数据库的大小。例如,您可以使用创建空测试数据库的数据库模式文件或定期从备份文件创建开发/测试数据库 –

相关问题