2009-08-25 108 views
16

我們的團隊進行了數百次集成測試,它們擊中數據庫並驗證結果。我爲所有集成測試提供了兩個基類,一個用於僅檢索測試,另一個用於創建/更新/刪除測試。只能檢索的基類在TestFixtureSetup期間重新生成數據庫,因此它僅對每個測試類執行一次。 CUD基類在每次測試之前重新生成數據庫。每個存儲庫類都有自己相應的測試類。如你所想,這整件事情需要相當長的一段時間(接近7-8分鐘才能運行並快速增長)。將它作爲CI(CruiseControl.Net)的一部分運行並不成問題,但在本地運行需要很長時間,並且在提交代碼之前確實禁止運行它們。集成測試最佳實踐

我的問題是有沒有最佳實踐來幫助加快這些類型的集成測試的執行?

因爲我們使用了sqlite中不支持的某些特定於數據庫的功能(計算列等),所以我無法在內存中執行它們(la sqlite)。

此外,整個團隊必須能夠執行它們,因此,在SQL Server Express的本地實例上運行它們或者可能會出錯,除非連接字符串對於這些實例而言都是相同的。

你是如何在你的店裏完成這件事的?

謝謝!

回答

5

我是一名java開發人員,但遇到了類似的問題。我發現運行本地數據庫實例的效果很好,因爲速度很快(無需通過網絡發送數據),並且因爲這樣您就不會在集成測試數據庫上發生爭用。

我們用來解決這個問題的一般方法是設置構建腳本從配置文件讀取數據庫連接字符串,然後在每個環境中設置一個文件。例如,一個用於WORKSTATION的文件,另一個用於CI。然後,您將設置構建腳本以根據指定的環境讀取配置文件。因此使用WORKSTATION配置運行在開發人員工作站上運行,並使用CI設置在CI環境中構建運行。

如果可以從單個腳本創建整個數據庫模式,那麼每個開發人員都可以快速設置本地數據庫進行測試,這也非常有幫助。您甚至可以將此概念擴展到下一個級別,並將數據庫設置腳本添加到構建過程中,以便可以編寫整個數據庫設置以跟上數據庫模式的變化。

11

在NUnit的,你可以用一個屬性如裝飾你的測試類(或方法):

[Category("Integration")] 
public class SomeTestFixture{ 
    ... 
} 
[Category("Unit")] 
public class SomeOtherTestFixture{ 
    ... 
} 

然後,您可以在服務器上構建過程規定所有類別的車子撞到,只是需要你的開發人員運行可用測試類別的子集。他們需要運行哪些類別取決於你會比我更好地理解的東西。但要點是,他們能夠在單元級別進行測試,並且服務器負責處理集成測試。

+1

+1這幾乎是我們在工作中所做的。在我們的CIS中,單元測試每天進行一次簽入和集成測試。 – mezoid 2009-08-25 14:53:17

+2

我在哪裏工作,我們在每個構建上運行集成測試。您運行集成測試的頻率越高越好。 – 2009-08-25 14:58:34

+1

@ Ken_Liu - 當然。通常情況下,將CI服務器上的可用cpu週期與每時每刻的提交數量進行平衡。這對每個開發團隊/環境都會有所不同。 – grenade 2009-08-25 15:01:39

3

你有沒有做過任何測量(使用計時器或類似的)來確定測試大部分時間花在哪裏?

如果您已經知道數據庫重新創建是耗費時間的原因,則不同的方法是重新生成一次數據庫並使用事務來保存測試之間的狀態。每個CUD類型測試都會在安裝程序中啓動事務並在拆卸後執行回滾。這可以顯着減少每次測試花費在數據庫設置上的時間,因爲事務回滾比完整的數據庫娛樂更便宜。

+0

是的,我以前見過這個想法,但如果你測試的某些代碼使用事務本身(記住,這些是集成測試)呢?然後一切都會中斷,所以我不認爲這是一般的實際情況。 – sleske 2009-08-27 10:18:55

+1

如果你在你的方法內部進行明確的事務管理,你是絕對正確的。在使用方面或代理來處理事務的情況下,此方法效果最佳。我們在基於Spring的項目中使用了這種方法,集成測試設置用單元測試管理的事務替換了代理。像魅力一樣工作。 – henrik 2009-08-27 11:22:15

3

我們有一個SQL Server Express實例,它爲每個開發機器運行相同的數據庫定義,作爲開發環境的一部分。使用Windows身份驗證時,連接字符串是穩定的 - 字符串中沒有用戶名/密碼。

我們真的想做的事情,但還沒有,看看我們的系統是否可以在SQL Server Compact Edition上運行,就像SQLite的SQLite引擎一樣。然後我們可以在內存中運行它們,也可以並行運行(有多個進程)。

+0

mmm SQL Compact。那*會很甜蜜! – grenade 2009-08-25 15:07:29

+0

我喜歡這個想法,當然! – 2009-08-25 15:13:03

13

保持您的快速(單元)和慢速(集成)測試分開,以便您可以單獨運行它們。使用任何方法對您的測試框架提供的測試進行分組/分類。如果測試框架不支持對測試進行分組,則將集成測試移到僅具有集成測試的單獨模塊中。

快速測試應該只需要幾秒鐘來運行所有這些測試,並且應該具有較高的代碼覆蓋率。這些測試允許開發人員無情地進行重構,因爲他們可以做一些小改動並運行所有測試,並且非常確信這種改變並沒有破壞任何東西。

慢速測試可能需要幾分鐘時間才能運行,它們將確保各個組件正常工作。當開發人員進行可能會破壞由集成測試而不是單元測試測試的某些更改時,他們應該在提交之前運行這些集成測試。否則,慢速測試由CI服務器運行。