【问题标题】:How to delete from database after tests insert data using PHPUnit?测试使用 PHPUnit 插入数据后如何从数据库中删除?
【发布时间】:2021-09-09 06:13:49
【问题描述】:

我想删除使用测试创建的每个新条目,以便可以再次运行它(无论是在 CI 构建中还是手动运行),而无需手动删除使用上一次运行测试创建的数据库条目。我找到了tearDown()tearDownAfterClass(),但它似乎只对连接/断开与数据库的链接有用。我可以用它来删除测试中的条目吗?

【问题讨论】:

    标签: unit-testing testing continuous-integration phpunit tdd


    【解决方案1】:

    我想删除使用测试创建的每个新条目,以便可以再次运行它(无论是在 CI 构建上还是手动运行),而无需手动删除使用上一次运行测试创建的数据库条目。

    在设置中创建数据库的在线快照并在拆卸中将其重置为快照点。

    无论您的测试对数据库中的数据或它的结构做了什么,它都不是在测试之前运行的快照的一部分,因此消失了。

    请向您的 DBA 咨询正在使用的数据库系统的选项,您可能还想引入系统管理员,因为这可能最容易通过文件系统的快照功能完成,并且您有兴趣将这一切与您的测试套件集成。

    【讨论】:

    • 这似乎可行。知道如何使用 SQL Oracle 解决吗?
    • 不是单独使用 SQL,而是检查您的 Oracle 文档,其中应该有相关的 SQL 命令。此外,这类问题最好向您的数据库管理员 (DBA) 提出,因为该人通常更了解您的数据库的细节。根据您使用的数据库(例如,不是供应商),测试中可能存在限制,DBA 通常可以与您讨论(这不是技术问题)。
    【解决方案2】:

    是的,你可以通过你提到的方法做到这一点。

    • tearDown 方法在类内的每个测试后启用
    • tearDownAfterClass 方法在类内所有测试结束时启用

    我建议你使用回滚模式,所以

    • setUp 方法中,您将初始化事务
        protected function setUp(): void
        {
            //...some boilerplate with establish connection
            $this->connection->beginTransaction();
        }
    
    • tearDown 方法中,您将回滚测试中所做的更改
        protected function tearDown(): void
        {
            $this->connection->rollback();
        }
    

    【讨论】:

    • 回滚的问题是更改已经提交,所以我认为它不会起作用。它必须是这样的,因为我需要测试这些方法是否真的写在 dB 中。有什么建议吗?
    • 如果数据量可控,您可以在 tearDown() 中手动回滚,即为测试中完成的 INSERT 编写 DELETE 语句。它没有那么好和通用,但仍然是一种选择。
    • @Masamune 如果数据库中存在数据,您可以轻松地在断言方法中检查它。请尝试此解决方案,我认为这对您来说已经足够了。该模式来自《xUnit 测试模式:重构测试代码》一书。如果你想通过搜索“teardown rollback phpunit”来查看 PHP 中的示例
    猜你喜欢
    • 2019-02-08
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2011-05-08
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多