2011-05-21 67 views
3


我正在看this視頻文章(由Jon Galloway和Jesse Liberty撰寫)關於構建測試存儲庫,他們提到擁有數據庫並不是一個好主意,而應該使用一個虛假的存儲庫。他們給出的兩個原因是:
1.數據庫可能不可用,並且
2.單元測試應該集中在代碼級別。爲什麼在測試中使用數據庫有問題?

所以關於第一個,我從未遇到過我想要處理任何事情和測試環境的場景。數據庫不可用,他們提出的第二點我沒有得到。

那麼在單元測試中使用你的數據庫是不好的做法?什麼是潛在的危害?

謝謝。

回答

3

單元測試應該測試一件事情,並且沒有外部依賴(即單獨測試)。

只要文件系統或數據庫或任何外部參與,它就是一個真正的集成測試。

如果單元測試依賴外部依賴性,它需要一個已知狀態,因此變得容易中斷(脆弱)。

正如@Darin提到的,通過恢復已知數據庫狀態,在事務中運行測試並在測試結束時回滾事務,確保已知狀態,您可以在集成測試中包含數據庫。

5

那麼在單元測試中使用你的數據庫是不好的做法?

在單元測試中使用數據庫但在集成測試中不好使用。單元測試的想法是單獨測試應用程序的不同層次。將它們綁定到數據庫使得它們不再是單元測試,因爲它們依賴於數據庫,所以它們與單元測試的最基本的規則之一相矛盾。

因此,當需要測試實際的數據訪問層(打到數據庫的那個層)時,您應該使用集成測試。在那些測試中,你應該設置一個測試數據庫。理想情況下,對於每個集成測試,此數據庫應處於已知狀態。爲了實現這一點,您可以使用腳本在測試夾具設置中創建數據庫,並將整個集成測試執行到單個原子事務中,該事務將在測試夾具拆卸中回滾,以便數據庫再次處於已知狀態下一個集成測試。

另一種方法(如果您使用的是ORM)是在集成測試中設置您的數據訪問層,以使用內存數據庫(例如SQLite),這些數據庫將在每個測試中創建並拆除。

+0

但是實際上在單元測試中使用DB有什麼危險? – 2011-05-21 09:15:48

+1

@Oren A,沒什麼,只是你不能稱它們爲*單元測試*。只需使用正確的話,它就是:-) – 2011-05-21 09:18:48

+0

非常感謝,我認爲Mitch在提到單元測試需要知道DB的已知狀態時觸及了主要觀點。 – 2011-05-21 09:21:53