PHPUnit:测试完成后如何从数据库中删除测试数据?

时间:2013-06-30 06:54:43

标签: php zend-framework doctrine-orm phpunit

我有一个使用Doctrine 2的Zend Framework应用程序(版本1.11)。我已经设置了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字段中的自动增量“回滚”到它们之前的状态?我知道如果ids之间存在差距真的无关紧要,但是如果有某种方法可以让Doctrine重置自动增量值那么好。

1 个答案:

答案 0 :(得分: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之间是否存在间隙。如果您使用的是测试数据库(高度推荐),那么这应该是一个较小的问题。