2010-10-14 86 views
23

我目前正在編寫Java客戶端服務器應用程序。所以我想實現兩個庫,一個用於客戶端,一個用於服務器。客戶端服務器通信有一個非常嚴格的協議,我不想用JUnit進行測試。HowTo單元測試客戶端服務器代碼

作爲使用Maven和Husdon服務器繼續集成的構建工具。

其實我沒有任何好的想法如何測試這些客戶端/服務器庫。

我有以下方法:

  1. 剛剛寫了一個虛擬的客戶端測試服務器,並寫一個虛擬服務器來測試客戶端。 缺點:不幸的是,這會導致許多額外的工作。我不能100%確定客戶端和服務器可以一起工作,因爲我不確定測試是否完全相同。

  2. 編寫一個測試項目,一起測試客戶端和服務器。
    缺點:單元測試不屬於自己的項目,所以哈德森不會自動運行它們。每個在這些庫之一改變任何東西的人都必須手動運行測試以確保一切正確。我也不會收到任何代碼覆蓋率報告。

有沒有更好的方法來測試這樣的代碼? 也許測試一個Maven Multi Module Project或類似的東西。

我希望任何人都能爲這個問題找到一個好的解決方案。

謝謝。

回答

2

所以最後的決議是建立一個多模塊項目,與包括服務器和 在Husdon偉大工程的客戶端模塊的獨立測試模塊。在Eclipse IDE中甚至更好。 謝謝@亞倫提示

8

思考的所有代碼爲「變換輸入到輸出」:X -> [A] -> Y

X是雲中的數據,[A]是變壓器,Y是輸出。你的情況,你有這樣的設置:

[Client] -> X -> [Server] -> Y -> [Client] 

所以單元測試工作是這樣的:

  1. 你需要運行的客戶端代碼生成X測試。驗證代碼實際上是否生成了帶有斷言的X。代碼中的X應該是final static String

  2. 在第二次測試中使用常量X來調用將其轉換爲Y(另一個常量)的服務器代碼。

  3. 第三個測試可確保客戶端代碼可以解析輸入Y

這樣,您就可以保持測試的獨立,仍然確保重要零部件的工作:界面之間組件。

+1

嗯,這接縫是完全以實現對服務器和客戶端的獨立單元測試的方式。事實上,這將導致將常量複製粘貼到兩個項目中,並因此實現「虛擬客戶端」/「虛擬服務器」。這是我上面列出的第一種方法。 – StaticBR 2010-10-14 08:31:39

+0

爲什麼你把客戶端和服務器放到不同的項目中? *困惑*無論如何,如果你真的想這樣做,那麼創建第三個單元測試項目,導入其他兩個項目,所以你只需要一次常量。 – 2010-10-14 08:55:35

+2

嗯,兩個項目,因爲客戶端必須去低資源設備。測試項目是我已經列出的第二種方法。我還寫了這種方法的缺點。 – StaticBR 2010-10-14 09:04:07

0

您可以使用任何模擬對象框架來創建模擬對象 - 試試jmockit。

1

我的建議是使用的測試分爲兩個級別:

  1. 爲您的客戶端/服務器項目,包括一些嘲弄在單元測試中,以確保對象的接口按預期工作。

  2. 構建完成後,進行更廣泛的集成測試運行,並自動將編譯的客戶端和服務器安裝在一個或多個測試系統上。然後你可以確保協議的所有細節都得到徹底的測試。在客戶端/服務器項目的每個成功構建版本上觸發此集成測試項目。您可以爲此使用JUnit,並仍然接收來自Hudson的傳統報告。

1

解決此問題的最新方法是使用Docker容器。創建一個包含基礎映像的docker文件以及客戶端服務器應用程序所需的所有必需依賴項。爲分佈式客戶端 - 服務器系統的每種節點類型創建一個單獨的容器,並使用TestNG或JUnit測試所有入口點服務器API /客戶端交互。這種方法最好的部分是你不嘲笑任何服務調用。在大多數情況下,您可以編排所有端到端的客戶端 - 服務器交互。

這種方法有一點點學習曲線,但是Docker在Dev社區變得非常受歡迎,尤其是爲了解決這個問題。

這裏是你如何可以使用泊塢窗客戶端API將泊塢窗圖像JUnit測試的例子: https://github.com/influxdb/influxdb-java/blob/master/src/test/java/org/influxdb/InfluxDBTest.java

相關問題