插入单元测试后清理数据的最佳做法是什么?

时间:2016-04-29 16:28:44

标签: php mysql unit-testing

正如头部所说,在我将一些行(仅用于测试)插入到单元测试函数中的数据库后,我当前在函数末尾放置一个查询来手动删除它们,但我相信这不是最好的做法。 那是什么?

2 个答案:

答案 0 :(得分:0)

好吧,在处理数据夹具时,最好的选择是实施setUp()tearDown()方法。
如果您已经分配了文件,数据库或套接字等外部资源,那么tearDown()方法似乎是最好的方法。

来自PHPUnit文档:

  

setUp()和tearDown()在理论上非常对称,但不是   实践。实际上,如果你需要实现tearDown()   已经在setUp()中分配了文件或套接字等外部资源。如果   你的setUp()只是创建普通的PHP对象,你通常可以忽略   拆除()。但是,如果您在setUp()中创建了许多对象,那么   可能想要取消设置()指向你的那些对象的变量   tearDown()所以他们可以被垃圾收集。垃圾收集   测试用例对象是不可预测的。

您可以在Chapter 4. Fixtures中获取更多信息数据夹具:

答案 1 :(得分:0)

“最佳实践”始终是主观要求。使用真实服务可能不是最好的做法,但我确实这样做,因为实际上我认为这对我来说最有效。通过使用真实服务,我实际上正在测试各种特定于数据库的细节(例如外键约束,触发器等)。

您可以创建数据库事务,执行SQL查询,然后回滚事务。但为了做到这一点,你需要两个假设:

  • 你并没有暗示自动增量字段的任何逻辑(无论如何你应该已经这样做了)
  • 您没有在执行隐式提交的事务范围内执行SQL查询。隐式提交无法回滚。

MySQL的隐式提交是according to its documentation,如下所示:

  

'ALTER TABLE',               '创造指数',               'DROP INDEX',               'DROP TABLE',               'RENAME TABLE',               '创造表',               '创建数据库',               'DROP DATABASE',               'TRUNCATE TABLE',               'ALTER PROCEDURE',               '创建程序',               'DROP PROCEDURE',               'ALTER FUNCTION',               '创造功能',               'DROP FUNCTION',               'ALTER VIEW',               '创造触发',               '创造观',               'DROP TRIGGER',               'DROP VIEW',               '创建用户',               'DROP USER',               '重命名用户'