2009-10-08 106 views
3

我正在使用桌面電子郵件客戶端,我想單元測試我的後端。但是,我看不到一種方法來完成這項工作。爲了使我的代碼正常工作,它必須連接到正在運行的郵件服務器。除非我將我的單元測試與一個電子郵件帳戶綁定,並確保該帳戶與我的測試期望的狀態相匹配,否則我看不到如何管理這一點。如何對電子郵件客戶端進行單元測試

有沒有人對如何測試這種應用,它通過設計依賴於外部因素,任何想法?

編輯:

要添加一些細節:我工作的一個C++更高級別的郵件客戶端庫爲我的應用程序,它使用libEtPan,C庫,實際處理連接到郵件服務器的詳細信息並與之互動。

回答

1

我要通過測試後承擔最後,您指的是實際與電子郵件服務器進行交談的代碼位,並測試此層的其他軟件。

現在這可能會或可能不會根據您的定義單位進行集成測試。坦率地說,我不在乎你決定怎樣稱呼它,但是如果你編寫了一些快速運行並且經常執行的自動化測試,那麼他們可能會使用與你的單元測試相同的平臺。

我想嘗試寫這個,因此它可以在免得以下兩個方面的工作中 - 第一個將它連接到您可以設置和配置,因爲你需要一個過程的本地電子郵件服務器。在Java中,我使用Dumpster,但我確定C++存在同樣的問題。 第二個將連接到至少一個本地電子郵件服務器,您可以腳本。一個你可以隨心所欲地噴灑(所以不是真實的或者在開發者之間共享1),並且運行相同的一組測試。原因是SMTP服務器的開發人員討厭每個人,你會想檢查你的存根工作原理是否與真實情況一樣。我認爲這相當於One Database Per Developer

現在,如果您還沒有編寫自己的SMTP客戶端,並且圍繞現有的第三方API創建了facade,那麼我不太可能通過「集成測試」來假設第三方API已經足夠受到bug影響脫落。我會嘲笑第三方API並驗證門面是否按預期工作。

1)也許你可以在CI週期中這樣做,然後在所有開發者之間共享一組電子郵件服務器,本地運行只需使用C++垃圾箱。

+0

你知道一種模擬C API的方法嗎?這就是我所看到的問題:如果它是一個C++庫,它似乎很簡單。另一個考慮是我不能100%確定我應該從第三方API中獲得什麼,因爲這對我來說很新穎,所以我更傾向於設置測試電子郵件服務器而不是嘲笑API的結果。 – 2009-10-08 13:44:57

+0

直到我發佈上述內容之前,我纔看到這個要求。我並沒有做太多的C/C++開發,但http://www.lastcraft.com/cgreen.php看起來很有前途。另一種選擇是在它周圍創建一個簡單的包裝器(基本上每個聲明的方法都是一個可嘲弄的接口,然後是一個真正的調用)。 – 2009-10-08 14:25:52

+0

但是,如果嘲笑C API是完全不可能的,則存根SMTP服務器如上所述,如果可以的話,使用垃圾箱等)。 – 2009-10-08 14:28:40

7

我會mock電子郵件服務器,並且嘲笑對象配置爲接收/拒收郵件適當(取決於你的測試)。

爲了有效地做到這一點,您需要一個接口來與您的電子郵件服務器通信。爲了測試,實現是一個嘲弄的對象。對於部署,您可以使用直接與郵件服務器通信的實現來替代它。

見本SO question用於C++嘲笑框架。

+0

問題是,我的後端將被嘲笑是一個C庫,所以我不能利用嘲笑它,除非我忽略了一些東西。 – 2009-10-08 13:36:23

+0

快速谷歌指向此:http://www.lastcraft.com/cgreen.php 它可以選擇模擬功能。 – 2009-10-08 13:41:23

+0

不要忘記,你可以定義一個新的接口,或者委託給你的庫,或者提供模擬的響應。把你的圖書館藏在一個新的界面後面(這可能是一個痛苦,我承認,如果原始圖書館界面很大) – 2009-10-08 13:46:50

0

正如你最有可能不想考驗你使用套接字的,你可能會考慮與虛擬服務器實現,不涉及任何TCP通信取代你的代碼的一部分。只需對來自客戶端的預期請求進行硬編碼,讓虛擬服務器作出適當的響應。

1

你必須找到一種方法與存根來代替真實的東西,那就是完全在你的控制。通常,這是通過模擬框架(例如Rhino.Mocks)完成的。

順便說一句。:如果你想使用一個「真實」的電子郵件帳戶,然後它不是一個單元測試了,但一個集成測試...

0

Andrew對於嘲笑郵件API是正確的。你在C中的問題可以通過以下兩種方式解決。

  • 提供了一個可以被模擬的簡單C++包裝器。
  • 使用鏈接器提供C api的測試/模擬版本,您必須使用與庫提供的相同的頭文件,但是您的單元測試與您的模擬C函數而不是庫鏈接。

有一本很好的書,解決了如何在困難的情況下進行單元測試:「有效地使用遺留代碼」,我不能很好地推薦本書。不要被標題拖延,本書將遺留代碼視爲沒有單元測試的任何代碼。

相關問題