2008-09-14 168 views
9

當您正在對數據訪問層或大部分應用程序堆棧進行集成測試時。如果在同一個數據庫上運行多個測試,最好的方法是什麼?數據庫集成測試

回答

9

交易。

什麼在軌道上的單元測試框架的紅寶石確實是這樣的:

Load all fixture data. 

For each test: 

    BEGIN TRANSACTION 

    # Yield control to user code 

    ROLLBACK TRANSACTION 

End for each 

這意味着

  1. 任何改變你的測試,使該數據庫將不會影響其他線程,同時它在 - 進度
  2. 下一個測試的數據沒有受到之前測試的污染
  3. 這比每次測試手動重新加載數據要快數十億倍。

我個人認爲這是很酷

9

對於簡單的數據庫應用程序,我發現使用SQLite非常寶貴。它允許您爲每個測試都有一個獨特的獨立數據庫。

但是,如果您使用簡單的通用SQL功能或者可以輕鬆地隱藏SQLite和您的生產數據庫系統之間的細微差異,但是我一直髮現在SQL中相當容易我開發的應用程序。

0

我想同時接受免費角馬的獵戶座愛德華茲的答案,但它不會讓我。我想這樣做的原因是,我得出這樣的結論:這是實現它的兩種主要方式,但選擇哪一種取決於個別情況(主要是數據庫的大小)。

+1

我總是發現一個問題在stackoverflow。如果你真的想說這兩個都是好的,那就是選擇的問題。 我想如果兩者同樣有用,那麼他們會被類似的數字投票,所以留在頂部。讓人們決定:) – 2008-09-14 23:41:23

0

也在不同時間運行測試,以便它們不會影響對方的性能或有效性。

1

只要添加到免費Wildebeest的答案我也使用HSQLDB做類似的類型測試,其中每個測試獲得一個乾淨的數據庫實例。

0

儘管在這裏其他答案之一不像Rails單元測試框架那麼聰明,但爲每個測試或一組測試創建不同的數據是另一種方式。這個解決方案的繁瑣程度取決於你擁有的測試用例的數量以及它們彼此之間的依賴程度。如果每個測試或一組相關測試都有一個數據庫,則單調乏味將會成立。

運行測試套件時,您會在開始時加載數據,運行測試套件,卸載/比較結果,確保實際結果符合預期結果。如果沒有,再次進行循環。加載,運行套件,卸載/比較。