2010-05-22 131 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或存根插座。也许这种模式可以提供帮助,但是您需要翻译您的语言。