【问题标题】:How can I test a function with void return value when using cunit使用 cunit 时如何测试具有 void 返回值的函数
【发布时间】:2020-06-20 10:39:20
【问题描述】:

我有一个需要用 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 测试这个函数?

【问题讨论】:

  • 你需要问自己,什么你想测试。然后你可以为它写一个测试。这种方法独立于特定的单元测试框架。 -- 例如,您可以将socket()bind()等真正的函数替换为您自己的mock,以检查它们是否被正确调用。

标签: c testing cunit


【解决方案1】:

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

  • 创建__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 代表解决方案)。最终添加一个拆卸函数来停用存根。

祝你好运

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多