0

我正在为名为 pkg_getclient () 的函数编写一个测试单元。基本上,它是一个为客户端无限监听的函数。
这是实现: http ://slexy.org/view/s21RBuOUOu (粘贴在那里以保持问题文本大小合理)

这是客户端-服务器测试的示例: http: //slexy.org/view/s2fS5hBkgI

这是我的单元测试的当前状态:

int test_pkg_getclient (char* portname) {
int netfd;
struct pkg_conn *result;
netfd = pkg_permserver(portname, "tcp", 0, 0);

/* validate_port(port); */
printf("TESTING PKG_GETCLIENT...\n");

result = pkg_getclient(netfd,callbacks, NULL, 0);

printf("TESTING VALID FILE DESCRIPTOR\n");
if (result  == PKC_ERROR)  {printf ("\t[ FAILED ]\n");
} else  { printf ("\t[ PASSED ]\n");
}
return 0;
}

int main (int argc, char* argv[]) {
test_pkg_getclient(argv[1]);
printf("%d",argc);
return 0;
}

我需要中断 pkg_getclient() 阻塞调用。它还需要移植到 Windows,而不仅仅是基于 unix 的系统。我无法修改 pkg_getclient() 函数。阻塞函数getclient() 内部。

有没有办法使用信号处理来中断阻塞调用?或者有没有其他方法可以解决这个问题?

4

2 回答 2

1

老实说,我不认为这真的有资格作为单元测试,因为您还涉及整个网络堆栈。

我建议采用不同的测试策略:更改您的代码,使其允许Dependency Injection。也就是说,应该可以在运行时将引用传递给网络堆栈以供使用。对于生产代码,您当然会使用真实的代码,但出于单元测试的目的,您使用模拟堆栈来实现覆盖您想要测试的内容所需的最小行为。

如果你想让你的测试也延伸到真正的网络堆栈(在这种情况下,我们处理集成而不是单元测试)我个人发现创建小程序并通过更高级别的脚本将它们粘合在一起更简单(bash ,蟒蛇等)。

于 2012-08-03T10:55:09.560 回答
0

首先,您可能想在调用之前调用fork(2) (假设 pkg_getclient 被阻塞)。其次,我不会使用阻塞调用,而是使用非阻塞套接字或select(2)pkg_getclient

至于可移植性,fork() 和 pthread 可以跨大多数 unice 移植。至于Windows,它有pthreads 的实现,但只有fork() 的模拟(例如Cygwin 实现了这个)。

于 2012-07-25T08:21:57.333 回答