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

bla*_*ong 3 php phpunit zend-framework doctrine-orm

我有一个使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,数据必须实际输入数据库,以确保一切都是犹太人.但是我不希望每次运行测试时所有的测试数据都会使数据库变成数据库,我也不想手动删除它.

有什么我可以做的,比如使用tearDown()方法在测试完成后摆脱测试数据?如果是这样,是否可以将表的id字段中的自动增量"回滚"到它们之前的状态?我知道如果ids之间存在间隙真的无关紧要,但是如果有某种方法可以让Doctrine重置自动增量值,这将是很好的.

Mic*_*Osl 5

1.关于"清理":

因为您使用的是InnoDB,所以您可以使用事务将数据库恢复到与测试开始之前相同的状态:

因此,setUp()您将添加$this->em->getConnection()->beginTransaction();并在tearDown() $this->em->getConnection()->rollback();此将数据库还原到以前的状态.另请参阅关于" InnoDB事务模型和锁定 "的MySQL手册,以确保它不会干扰应用程序中的任何其他数据(关键字:隔离级别).

2.关于回滚自动增量ID:

据我所知,这不是(轻松)可能的.在SO上有一个关于它的线索,其中声明您的应用程序不应该关心自动增量ID之间是否存在间隙.如果您正在使用测试数据库(强烈建议使用),那么这应该是一个较小的问题.