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

标签 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 字段中的自动增量“回滚”到它们之前的状态?我知道 id 之间是否存在间隙真的无关紧要,但如果有某种方法可以让 Doctrine 重置自动增量值,那就太好了。

最佳答案

<强>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 之间是否存在间隙。如果您使用的是测试数据库(强烈推荐),这就更不用担心了。

关于PHPUnit:测试完成后如何从数据库中删除测试数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17387962/

相关文章:

doctrine-orm - 如何使用 doctrine2 zf2 在 View 助手中获取实体管理器

symfony - 在 where 条件下的学说 ORM 计数数组集合

php - 如何在 PHP 中获取关联数组的索引?

php - 在订单数组中查找重复值并替换

PHP PDO 强制 SQL99

php - Zend_Db_Table_Abstract 和 Zend_Db_Expr

php - 如何解决用户浏览到index.php的情况

php - 当我更新 session 数组中的值时,它们会被清除

php - 在 View 中使用 getter 是一种好习惯吗?

symfony - 我应该将学说注册表或特定存储库、实体管理器传递到 symfony2 中的 DI 容器吗?