c - C 中的测试单元用于服务器监听功能。避免监听阻塞调用

标签 c unit-testing sockets portability signal-handling

我正在为名为 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()内部

有什么方法可以使用信号处理来打破阻塞调用吗? 或者还有其他办法解决这个问题吗?

最佳答案

老实说,我认为这并不真正符合单元测试的条件,因为您还涉及整个网络堆栈。

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

如果您希望将测试扩展到真实的网络堆栈(在这种情况下,我们处理集成而不是单元测试),我个人认为创建小程序并通过更高级别的脚本(bash、python 等)将它们粘合在一起更简单。

关于c - C 中的测试单元用于服务器监听功能。避免监听阻塞调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11645257/

相关文章:

打印指针相关代码时编译器崩溃

sql - postgres - 以编程方式将 1gb 模拟数据加载到表中的方法

ios - 在 Swift TDD 中模拟 NSBundle

ios - 如何在 Swift 中通过 tcp 套接字读取字符串

python - 为什么我会收到错误的文件描述符错误?

c - sockaddr 和 IPv6 地址

c - 如何使用 scanf 函数在输入的数字之间添加 (*)?

c - pthread,Windows 上的 pthread,pthread 故障,链接器错误,msvc 2008/2010 上的 pthread 链接器错误

c - 为什么矩阵乘法算法中的循环顺序会影响性能?

c# - Visual Studio - 已存在具有相同 ID 的测试