2010-09-02 71 views
1

我想以我可以回滾任何數據庫更改的方式編寫我的Web服務的測試用例。我可以嘗試用事務範圍來包圍它們,但是如何爲事務指定上下文?換句話說,交易如何知道回滾哪個數據庫和服務器?就我而言,SQL服務器在本地以及Web服務上運行。在您告訴我在沒有客戶端的情況下直接調用Web服務之前,請明白,Web服務具有非常特定的運行時環境設置,這對我的測試用例來說是一件非常痛苦的事情。也許,交易範圍不是我想要使用的,有沒有其他選擇?有一個數據庫函數可以調用來啓動事務嗎?謝謝。單元測試,Web服務和數據庫事務

回答

2

首先你沒有進行單元測試。單元測試是關於測試單個小代碼單元(函數)。當您測試一個函數時,您正在爲每個執行路徑創建單元測試,以便您完全覆蓋測試過的代碼。但是你的系統正在測試包括客戶端服務通信和數據庫通信服務=幾層代碼+配置。這就是所謂的集成測試。

這裏的問題是您是如何設計服務的?您的服務是否流動交易?事務流允許在客戶端啓動事務並將其傳遞給服務(分佈式事務)。這不是默認行爲,它需要特殊的WCF綁定配置。如果你使用這種方法,你可以在你的測試中做同樣的事情。在測試時開始事務並在測試結束時回滾事務。如果您沒有設計服務來處理流量交易,您就無法使用它,因爲您在測試中開始的交易不會影響服務。在這種情況下,您有幾種選擇:

  • 創建手動補償。在每次測試運行結束時自定義SQL將數據移動到初始狀態。這模擬了回滾。我不推薦這種方法。
  • 在每次測試開始時重新創建數據庫。這很慢但完全可以接受,因爲集成測試通常每天只能在構建服務器上運行幾次。
  • 不要測試WCF服務級別。 WCF服務應該只是業務邏輯或數據訪問邏輯上的一些封裝。所以不要測試服務級別,而是測試包裝層。你可以在那裏使用交易。這種方法可以很好地與前一種方法結合使用,以便您可以進行一些複雜的集成測試,這些測試需要數據庫重新創建以及一些可以回滾並使用相同數據庫的更大的測試。
+0

謝謝。這裏真正的問題是我不控制業務層運行的上下文。它調用需要在ASP.NET下運行的第三方DAL,並檢查許可信息。我不能和這兩個人離婚。測試將不得不在IIS下運行才能工作。 – 2010-09-02 19:53:15

+0

比第二種方法可能是最適合你的。 – 2010-09-02 19:56:54

+0

上面的答案是正確的,但我會補充說應該使用Mocks來啓用單元測試,這樣您可以輕鬆地建立一套單元測試和集成測試,並且可以輕鬆地從相同的代碼庫中獲取 – MetalLemon 2010-09-03 04:59:54