2016-04-29 77 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', '重命名用戶'

相關問題