2010-05-22 140 views
1

有沒有任何'好'的方法可以讓等待recvfrom()調用的線程變得暢通無阻並返回一個錯誤?單元測試UDP套接字處理代碼

這樣做的動機是爲包含讀取UDP數據報的單元的系統編寫單元測試。其中一個分支處理recvfrom調用本身的錯誤。代碼不需要區分不同類型的錯誤,只需設置一個標誌即可。

我想過從另一個線程關閉套接字,或者關閉它,導致recvfrom返回一個錯誤,但這似乎有點沉重。我在其他地方看到發送一個超大的數據包就可以做到這一點,因此設置了一個實驗,在這個實驗中,一個16K緩衝區被髮送到一個recvfrom,等待4K,但這不會導致錯誤。 recvfrom只返回4096,表示它已經得到了很多字節。

回答

2

如果您正在測試的課程與您的其他應用程序完全隔離,也許您可​​以從單元測試批發#include .c源文件。然後,您可以僅在測試中使用宏來將#define recvfrom(...)添加到您自己的私人函數中。

請注意,這會將您的私有實現暴露給單元測試;你仍然應該測試公衆界面,假裝你看不到膽量。這很不方便,但它至少包含了單元測試的所有醜陋,而不會中斷可交付代碼。

1

您可以創建一個圍繞網絡庫的類,有時會根據某些條件使其失效。例如,您可能會根據某些網絡性能級別使該網絡層發生故障,並在某些頻率下模擬錯誤。

I have asked a similar question以前可能也有幫助。

+0

問題的一部分是我已經繼承了一個已經存在的設計,並且添加類可能會弄亂太多的羽毛,儘管它可能會來到那 – JustJeff 2010-05-22 02:47:25

+0

@JustJeff:要最小化代碼更改,您可以使用#define來重新定義你想模擬錯誤的函數。然後你編譯一個選項,所有那些只在你的測試套件代碼中定義。 – 2010-05-22 02:50:47

+0

@Brian R. Bondy - 是的,理想情況下,被測試單元將是可交付代碼,而#defining從它下面recvfrom使它無法交付,我可能能夠提出「至少.cpp文件是不是mod'd「 – JustJeff 2010-05-22 17:01:08

0

我認爲可能有必要採取一些手段或技巧。

您是否試過使用ioctl(sock, FIONBIO,將套接字切換到非阻塞模式?

0

最簡單的可能是發送信號,但這取決於原始代碼是否具有處理程序設置。

0

我從來沒有在C中做過這樣的事情,但在C#/ Java中,我圍繞套接字,TCPClient等創建了包裝類。每個包裝類實現了一個我創建的接口,它代表了我感興趣的方法。這使我可以使用依賴注入模式來注入Mocked或存根插座。也許這種模式可以提供幫助,但是您需要翻譯您的語言。