2009-09-15 82 views
1

我正在面對數據訪問層做單元測試,所有的數據訪問層都通過存儲過程調用數據庫。 我打算創建一個乾淨的數據庫用於單元測試,但我發現大多數存儲過程會遠程調用其他數據庫,我不知道如何單元測試這種存儲過程,我應該創建所有相關的數據庫?或任何其他解決方案?如何做遠程存儲過程的單元測試

回答

2

一般情況下,更可以抽象的數據訪問層從應用程序的其餘部分之遙,你可以更好的單元測試。正如Jayden在另一個答案中所寫的那樣,Test Doubles如動態模擬是一個很好的解決方案。

不過,我明白你的問題,要明確進行單元測試數據訪問層,和那也可以。在這種情況下,動態模擬不會幫助你,因爲你將在應用程序中測試最低層 - 沒有什麼可以模擬出來的。有些人堅持認爲這不是一個單元測試而是一個集成測試,但我認爲重要的部分是測試是否是自動的還是沒有,不是我們稱呼它。

在任何情況下,一旦開始測試數據訪問層,您或多或少必須按原樣處理它。如果它使用遠程存儲過程,那麼你將不得不處理。爲了使設置更簡單一點,您可能希望將'remote'數據庫放在與'local'數據庫相同的盒子中。

單元測試主要是一個行爲測試,所以這樣可以。就必須有其他類型的測試(集成測試系統測試)使用一個現實的設置與許多分佈式機等用於驗證安全,網絡等按預期工作,但是這不應該是主要焦點的單元測試。

1

看着對象嘲笑。

犀牛嘲笑是一個解決方案,你可以開始看它here

嘲諷將可以模擬從數據庫的數據訪問,而無需實際有一個「測試」數據庫建立。在設置模擬方面有一點點工作,但它保持了測試的一致性。

+1

+1否定-1有人給出了這個答案,但沒有留下評論。傑登的權利(雖然我會使用Moq):) - 如果您使用的是數據庫,那麼您不會進行純粹的**單元**測試。您可能想要在DAL上執行**集成**測試,這沒關係。對於您的測試數據庫,只需使用返回靜態數據的存根sproc替換實際的sproc。 – TrueWill 2009-09-15 03:18:33

1

你可以考慮構建數據庫引用其他的,讓所有的遠程表都可以通過視圖的訪問。我通常遵循的命名約定:

vw_[DATABASENAME]_[TABLENAME] 

視圖由不外乎:

select * from server.dbo.tablename 

所有存儲過程通過視圖訪問遠程表,而不是直接,即在訪問Person表遠程數據庫調用工作人員將:

create view vw_STAFF_Person 
as 

select * from Staff.dbo.Person 

go 

create procedure stp_Select_Staff 
as 

select * from vw_Staff_Person 

go 

而不是

create procedure stp_Select_Staff 
as 

select * from Staff.dbo.Person 

go 

這樣做的基本原理是,當您要測試數據庫時,您可能希望將所有遠程數據庫重新鏈接到「測試」遠程數據庫。當訪問遠程數據的唯一對象是簡單視圖時,這通常比較容易,而不是通常更多和更復雜的存儲過程。

我通常有一份工作設置一個可以重寫的意見,「測試」數據庫,所以它是自動完成的。

附加到這一點,我也經常有工作建立,恢復生產數據庫備份,以「測試」環境,使測試能夠對包含實時數據的副本系統進行部署前。只需重新鏈接視圖,而不是將所有存儲的proc引用引用到遠程系統,此過程再次變得更加簡單。

爲了使對安全性測試更容易,我也始終將數據庫的安全性在數據庫roles的水平,而不是特定的用戶,因爲我覺得整個的生產,測試和開發環境roles更便攜比users

希望一些這些提示的幫助。