0

我有一个需要用 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 测试此功能?

4

1 回答 1

0

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

  • 创建__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(),然后用 a CU_ASSERT_EQUAL(foo_peek_value(), 42);(42 代表解决方案)检查结果。最终添加一个拆卸功能来停用存根。

祝你好运

于 2020-08-06T10:45:03.090 回答