C语言 使用 cunit 时如何测试具有 void 返回值的函数



我有一个函数,我需要用cunit进行测试。 该函数如下所示:

void server(unsigned short port) {
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd < 0) {
perror("server: socket");
exit(1);
}
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
memset(&server.sin_zero, 0, 8);
if (bind(sock_fd, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("server: bind");
close(sock_fd);
exit(1);
}
if (listen(sock_fd, MAX_BACKLOG) < 0) {
perror("server: listen");
close(sock_fd);
exit(1);
}
......
}

如何使用 cunit 测试此功能?

正如忙碌的蜜蜂所说,这个函数做了一些比它可能返回的值更重要的事情。我没有很多经验,但这是我要做的:

  • 创建__stub_函数以包装__real_函数。这些可能是socket()perror()exit()memset()bind()close()listen()。你可能不需要它们,所以问问你自己哪个重要。您可以随意包装任何函数(至少使用 gcc(,这意味着将所有对foo()的调用替换为对__stub_foo()的调用。我曾经看到的foo_stub.c文件的架构是:
#include <xtypes>
#include "foo.h"
bool_t m_stubbed = FALSE;
void __stub_foo(void);
something foo_peek_value(void);
extern void __real_foo(void);
void __stub_foo(void){
if(m_stubbed){
/* test code */
}else{
__real_foo();
}
}
something foo_peek_value(void){
return /* an interesting variable */
}

另外用-Wl --wrap=foo调用 GCC .

  • 创建一个设置foo存根的测试文件(通过将m_stubbed切换到true(,使测试例程调用foo((,然后用CU_ASSERT_EQUAL(foo_peek_value(), 42);检查结果(42代表解决方案(。最终添加一个拆解功能来停用存根。

祝你好运

最新更新