2011-01-06 55 views
1

好吧,它們不是單元測試,而是端到端測試。該設置有些牽扯。單元測試將使用C#,ODBC連接。每個單元測試都會嘗試自行清理,但每過20次測試(每個C#類一次),我們都需要執行完整的數據庫還原。我不認爲我可以做到這一點通過ODBC連接,根據該文件:嘗試針對SQl Server 2008編寫單元測試時出現雞和蛋問題(恢復數據庫)

http://www.sql-server-performance.com/articles/dba/Obtain_Exclusive_Access_to_Restore_SQL_Server_p1.aspx

消息6104,級別16,狀態1,第1行 不能使用KILL來殺死你自己的 過程。

不過,我想這樣做,以便199個測試不會因爲清理不好而走火入魔。有另一種方法嗎?也許我可以打開一個不同的「連接」,如使用COM自動化或類似的東西,然後從那裏殺死所有的數據庫連接?如果是這樣,我該怎麼做?

此外,將客戶端能夠恢復後自動重新連接,否則我將不得不每20個測試左右拆除一切嗎?

如果你覺得這個問題令人困惑,請讓我知道你的問題是什麼。謝謝!

+1

只是關於術語的說明 - 如果你的單元測試並不只是測試一個單位,他們沒有單元測試。在這種情況下,因爲您正在測試單位並且同時依賴於其他單位(依賴於數據庫的代碼/類),所以您可以將其稱爲「集成測試」。 – 2011-01-06 21:49:28

回答

1

如果你能確保你能正確地關閉您的ODBC連接,爲你可以使用ADO.NET直接執行從池中一個新的連接恢復您的C#集成測試的目的。

我認爲如果你切換你從快照中恢復,而不是完全備份,你可能會發現牛逼快得多。

+0

我是一個小菜鳥,有更多的細節會有很大的幫助。 – 2011-01-06 23:40:18

1

當然,您可以從ODBC連接進行恢復。你不能恢復,如果你是使用-ING您試圖恢復DATABSE,但微不足道的改變上下文tempdbmaster

USE [tempdb]; 
RESTORE DATABASE foo FROM ...; 

如果有使用其他數據庫的連接,它們將是你擁有連接,所以它只是確保您正確關閉它們。如果您使用連接池,請清理池。 SqlClient使用SqlConnectionClearAllPools,ODBC使用OdbcConnection.ReleaseObjectPool以某種方式類似的效果。要點是,這一切都在你的掌控之中。

順便說一句,你爲什麼使用ODBC,而不是SqlClient中的任何原因?

+0

我加入了一個正在退出的大型項目,但我認爲這是因爲我們還支持Oracle和Sybase連接。謝謝(你的)信息!我可能希望以非優雅的方式殺死一些現有的連接,因爲大型應用程序由幾個不同的進程組成,它已經很長時間沒有進行任何測試。 – 2011-01-06 23:47:41