2008-10-12 44 views
2

我有一個C#模塊負責獲取在Windows Vista計算機上「連接到互聯網」的網絡適配器列表。該模塊使用「Network List Manager API」(或NLM API)遍歷所有網絡連接並返回IsConnectedToInternet值爲true的所有網絡連接。單元測試模塊,檢查互聯網連接

我收到了一些建議,這個模塊的實現在這個SO question

爲了測試這個模塊,我決定寫一個返回基於另一種邏輯網絡連接列表界面幫手,所以這將是對原始模塊邏輯的一種「現實檢查」。請注意,對於測試助手,我願意使用可能被認爲是生產代碼不良實踐的檢測方法(例如,依靠諸如「Google」的一些互聯網資源可用 - 以防萬一關閉,被我們的內部防火牆阻止等。與部署的產品基礎相比,修復測試相對容易)。

我選擇的另一種檢測方法是嘗試使用TcpClient連接到「www.google.com:80」。我的問題:當我有多個連接的適配器(例如無線和LAN)時,檢測方法會失敗,其中一個出現錯誤「連接請求是在已連接的套接字上進行的」。

我的問題是三折:

  1. ,你會如何去一般測試這樣的模塊?你是否支持以不同方式做同樣事情並比較結果的想法,還是一個矯枉過正的問題,我應該依靠系統的API?我的主要問題在於,預先配置系統非常困難,所以我會提前知道預期的結果。

  2. 你會建議什麼替代邏輯?前面提到的問題中提到的一件事是查看路由表 - 將每個具有目標爲0.0.0.0的路由條目的適配器視爲「連接到Internet」,如何考慮?其他建議?

  3. 您是否明白爲什麼當前測試邏輯會出現「已連接」錯誤?

回答

4

我只能回答你關於單元測試的問題。

您正在測試的代碼用您自己的話說就是「一個C#模塊,負責獲取在Windows Vista計算機上連接到互聯網的網絡適配器列表該模塊使用」網絡列表Manager API'(或NLM API)遍歷所有網絡連接並返回IsConnectedToInternet值爲true的所有網絡連接。「

如果我正在編寫這個模塊,我會首先使用NLM API的接口,將其稱爲... NLMAPIService。現在,對於真實的代碼,創建一個實現NLMAPIService並調整實際NLM API的適配器。

爲了進行測試,創建一個類FakeNLMAPI實現NLMAPIService並擁有其所有內存中的數據的某個地方,或在一個XML文件,或什麼的。您的模塊僅在NLMAPIService上調用方法,因此您不必根據是否測試來更改任何「真實」代碼。

因此,在您的測試設置方法,您可以實例FakeNLMAPI並將它傳遞給你的模塊,並在生產,實例化NLM API適配器。

我會假設你可以實例化和修改表示網絡連接的對象。如果沒有,您可以按照相同的模式僞造實際的網絡連接對象。

0

UnitTests不應該訪問外部資源。要UnitTest你的方法,我會將網絡列表管理器API存根。

您仍然需要驗收測試圖層。在該測試環境中,您應該複製您希望在您的環境中支持的各種配置,設置您自己的虛擬主機,路由器,機器配置。驗收測試應該使用Fitnesse這樣的工具在用戶體驗級別完成。

2

依賴注入是一個非常方便的方式來處理這樣的問題。不是直接在代碼中直接使用NLM API組件,而是定義一個接口和一個實現它的類,並充當NLM API的代理。將這個類的實例傳遞給構造函數中的模塊,讓你的模塊使用它。在您的單元測試中,而不是真正的代理對象,使用返回已知信息的模擬對象 - 它甚至不必引用NLM API - 用於測試模塊的邏輯。當然,你的代理類也需要一些測試,但其中的邏輯要簡單得多 - 可能只是一些數據編組。您可能能夠說服自己的正確性,或者,如果沒有,請對其進行一些手動測試以確保其正常工作。