【问题标题】:Test unit in C for server listening function. Avoid listen blocking call用于服务器侦听功能的 C 中的测试单元。避免监听阻塞呼叫
【发布时间】:2012-07-25 08:04:53
【问题描述】:

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

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

【问题讨论】:

    标签: c unit-testing sockets portability signal-handling


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我不能/不应该改变我正在测试的结构,所以我不能使用非阻塞套接字。我可能会看看选择
      • 仍然没有找到打破阻塞呼叫的解决方案
      • @pAndrei:您能做的最好的事情就是使用 alarm(2) 设置超时并为 SIGALRM 安装信号处理程序。这将(当计时器触发时)调用信号处理程序,中断阻塞的系统调用。这将允许您的测试代码再次获得控制权,这种策略可能只会使您的单元测试在超过时间限制时失败(尽管 SquareRootOfTwentyThree 说这有点太大而不能称为单元测试。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多