2016-04-29 81 views
2

正如头部所述,在我为单元测试函数插入一些行(仅用于测试)到数据库之后,我当前在手动删除这些功能的功能,但我认为这不是最佳做法。 那它是什么?在插入单元测试后清理数据的最佳做法是什么

+2

单元测试通常不应该有真正的服务进行交互:通常的做法是为* *嘲笑他们,而不是。 – eggyal

+1

Ruby on Rails使用事务来回滚测试期间所做的更改。 – tadman

+0

老实说,我更喜欢与真实服务交互,因为它更像是一个准确的“测试” - 而且由于回滚事务只影响自动增量,自动增量不应该有任何逻辑应用于它们,所以我认为它很好启动事务,执行测试,然后在事务结束时回滚事务。只需注意通过触发隐式提交(例如'ALTER')来中断事务的SQL查询。但是,虽然这是我所做的,但我不确定这是否是最佳做法。 –

回答

0

那么,在Data Fixtures上工作时,最好的选择是实现setUp()tearDown()方法。
如果您已经分配了文件,数据库或套接字等外部资源,那么tearDown()方法似乎是最佳方式。

从PHPUnit的文档:

设置()和tearDown()是在理论上,而且不是在 实践中很好地对称。实际上,如果 已在setUp()中分配了外部资源(如文件或套接字),则只需实施tearDown()。如果 你的setUp()只是创建普通的PHP对象,你通常可以忽略 tearDown()。但是,如果在setUp()中创建了许多对象,则 可能想要取消设置()指向这些对象的变量tearDown(),以便它们可以被垃圾收集。 测试用例对象的垃圾回收不可预测。

可以在Chapter 4. Fixtures获得更多的信息数据灯具:

0

“最佳实践”始终是一个主观的要求。使用真实服务可能不是最佳实践,但我确实是这样,因为实际上这是我觉得最适合我的。通过使用真正的服务,我实际上针对各种特定于数据库的细节(例如外键约束,触发器等)进行测试。

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

  • ,你是不是意味着从自增字段的任何逻辑(你应该已经做了,反正)
  • ,你不执行执行隐式提交的事务范围内的SQL查询。隐式提交不能回滚。
  • 为MySQL

隐提交的,according to its documentation如下:

'ALTER TABLE', 'CREATE INDEX', 'DROP INDEX', 'DROP TABLE', “重命名表”, 'CREATE TABLE', '创建数据库', 'DROP DATABASE', '截断表', 'ALTER PROCEDURE', 'CREATE PROCEDURE', 'DROP PROCEDURE', 'ALTER FUNCTION', 'CREATE FUNCTION', 'DROP FUNCTION', 'ALTER VIEW', 'CREATE TRIGGER', 'CREATE VIEW', 'DROP TRIGGER', “DROP VIEW”, 'CREATE USER', 'DROP USER', '重命名用户'

相关问题