我有一个函数,我需要用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代表解决方案(。最终添加一个拆解功能来停用存根。
祝你好运