2010-10-27 170 views
4

我目前正在構建一個.net Web應用程序,該應用程序使用WCF Web服務來允許Flex前端訪問數據庫。針對測試數據庫集成測試Web服務

我正在對Web服務設置一些單元/集成樣式測試,並試圖找出允許測試訪問和修改單獨測試數據庫中數據的最佳方法。

目前,我的單元測試項目中的連接字符串指向我的測試數據庫,並且我的Web服務項目中的連接字符串指向我的開發數據庫。但是,當我使用Linq時,似乎在我從我的測試類調用Web服務方法時,它使用開發數據庫連接字符串。

我研究過創建模擬對象或內存數據庫,但我相信會發生同樣的問題。

有沒有辦法讓這個工作,或者是我對我想要什麼不正確的整個想法,在這種情況下是否有更好的方法來設置它?我的項目還很早,我不會對重大改變解決方案架構產生不利影響。

回答

1

確保Web服務中的代碼是最小的,並不比對服務層的簡單調用更多。當你這樣做時,你可以直接跳過調用Web服務,並創建一個也稱爲服務層的集成測試套件。在這種情況下,您正在進行進程內呼叫,而不是通過網絡進行呼叫。在這種情況下,確保訪問正確的數據庫將會容易得多,並且您可以輕鬆地將這些調用與將要回滾的數據庫事務進行封裝。您當然希望將任何操作回滾到數據庫,因爲維護RTM tests將非常困難。一種方法是使用TransactionScope內部測試。

祝你好運。

+0

我決定使用TransactionScope將我的調用保留在進程中,而不是保存到數據庫。看起來這樣也可以保持低時間運行測試的時間。 – Steve 2010-11-18 05:51:46

5

Steven的建議是取消測試的WCF管道。這肯定會起作用並測試大部分業務邏輯,但我希望我的自動化集成測試也能測試WCF交互。

我已經在我的項目的自動化測試中成功實現了這一點。

請注意,WCF客戶端和WCF主機可能共享相同的進程。在這種情況下,它仍然通過WCF框架進行調用,並帶來所有的限制和複雜性。你的WCF服務將從你測試項目的配置文件中獲取連接字符串。

只是爲了說明這一點,如果客戶端和服務在同一個進程中,那麼配置文件可能看起來像這樣。

<configuration> 
    <connectionStrings> 
    <add name="ContractsManager" 
     providerName="System.Data.SqlClient" 
     connectionString="Data Source=localhost;Initial Catalog=ContractsManager_AutoTest;Integrated Security=True;Pooling=False;Asynchronous Processing=true;Application Name=CmAutoTests" 
     /> 
    </connectionStrings> 
    <system.serviceModel> 

     <client> 
      <endpoint 
       name="LoggingService" 
       address="net.tcp://localhost:9612/loggingService" 
       binding="netTcpBinding" 
       contract="ContractsManager.ILoginService" /> 
     </client> 
     <services> 
      <service name="ContractsManager.LoginServiceImpl"> 
       <endpoint 
        address="net.tcp://localhost:9612/loggingService" 
        binding="netTcpBinding" 
        contract="ContractsManager.ILoginService"> 
       </endpoint> 
      </service> 
     </services> 
    </system.serviceModel> 
</configuration> 

這樣你的自動化測試會發現錯誤特定於WCF(例如,投擲不是由一個故障合同規定的除外)。 今天我被保存了:我的代碼有一個錯誤,這意味着渠道沒有被正確關閉。我的測試保持懸掛狀態,因爲正在達到限制限制。花費了一些時間才弄清楚,但我很感激這個bug並沒有發現它的生產方式。

測試套件應在第一次測試運行之前設置服務主機。 (我已經嘗試設置每個測試並拆除服務主機,但運行速度太慢)。

祝你好運。

0

由於WCF Web服務類未綁定到ASP.Net基礎結構(不必從Syste.Web.Services.WebService繼承),因此您可以輕鬆地將對存儲庫或對象上下文的引用插入到服務。然後,您可以使用單元測試來測試Web服務本身中的任何邏輯,這些單元測試將使用一些模擬內存中存儲庫,並因此很快運行。另一方面,集成測試將使用一些真實的數據庫,您可以捕獲與持久層相關的錯誤。所以我不同意Steven的看法,即Web服務方法應該只是一種叫做某個服務層的方法,除非邏輯太重,不值得擁有自己的類。