0

我們有以下設置:Visual Studio的差異,當在Visual Studio和構建服務器上運行測試

  • 的Visual Studio 2012/SQL Server 2012的
  • TFS 2010年,構建服務器自動運行單元測試的構建。
  • 與大量的代碼和2個測試項目中的溶液(以便在構建時2個獨立的組件),測試用Visual Studio的單元測試框架完成。
  • 的第一組件包含了所有實際的單元測試,他們也都運行正常。在大多數測試中,我們在db中寫入一些數據,運行一些代碼,然後清理數據。
  • 我們使用第二個程序集進行數據庫播種。由於測試和集被加載/按字母 順序執行,我們在第二組件的名稱以 「Z」開頭的測試(集名稱也開始與「Z」)。構建服務器日誌 也確認Z測試是最後執行的。所以這個測試 只寫入數據庫中的一些數據。我們更喜歡這個播種與使用DB項目 由於現有的基礎設施, 讀取Excel文件數據,並寫入到SQL Server。

問題是,當我們在我們的開發機器上運行所有測試時,Z測試最後執行,並且種子數據保留在數據庫中。當在構建服務器上執行測試時,Z測試也會最後執行,但數據不會保留在數據庫中。

按照SQL Server Profiler中,插入/創建表執行,所以數據都在我們的機器和構建服務器上的數據庫得到,但在構建服務器上的一些刪除/降查詢後立即執行插入。我們無法分辨他們來自哪裏。

我們試圖運行只有Z測試組件和數據保留在數據庫中。所以滴液必須由其他組件引起。但是如何?爲什麼visual studio和構建服務器運行測試的方式有所不同?

有沒有人遇到過這樣的事情?

回答

0

我們最終設法解決了這個問題。事實證明,第一個程序集有一些在[ClassCleanup]方法中運行的清理代碼。第一個程序集的ClassCleanup代碼在Z測試之後運行(來自第二個程序集)。所以這個快速解決方案就是用一個完成播種的[AssemblyCleanup]方法替換Z種子測試。

2

根據你的單元測試是一件危險的事情。首先它違背了單元測試的整體思路(它們應該是獨立訂單),但它也是你無法保證的東西。

這是巧合的,你的單元測試總是在你的開發機器上以相同的順序運行。

如果您需要某些代碼才能在其他測試運行以播種數據庫之前運行,則可以使用Assembly Initialize屬性。通過這種方式,您可以確保此方法始終在其他測試之前運行。

另外需要注意的是,使用數據庫的單元測試實際上是集成測試。我會非常謹慎地使用這樣的結構。我前段時間寫了一篇關於此的博客文章,其中顯示了您可能遇到的問題類型,但也指出了一些解決方案:Unit Testing, hell or heaven?

+0

我同意,但在這種情況下,我們只需要一種快速的方法來種子一些數據。這篇文章非常好,謝謝! – pax162 2013-02-11 09:47:07

相關問題