gpt4 book ai didi

c - 在多个 cmocka 单元测试中分配内存

转载 作者:太空宇宙 更新时间:2023-11-04 04:17:45 24 4
gpt4 key购买 nike

我正在尝试使用 cmocka 对一些源代码进行单元测试。基本上(相关的)源代码看起来类似于 Source.c。

单元测试分别调用每个函数。在测试 Add() 函数时,此函数最终将调用 util_malloc()(此函数通常在 malloc 之前检查 0 大小),该函数由单元测试包装。在包装函数 __wrap_util_malloc() 中,在 Wrappers.c 中,首先检查大小是否符合预期,然后使用 malloc 分配内存。

接下来测试 Remove() 函数,其中释放先前分配的内存。


运行测试时,cmocka 返回以下错误:

<failure><![CDATA[Blocks allocated... project_path/wrappers.c:46:  note: block 00341e58 allocated here ERROR: Add_Test leaked 1 block(s) ]]></failure>

<failure><![CDATA[EXCEPTION_ACCESS_VIOLATION occurred at 004060af.
To debug in Visual Studio... [...]
]]></failure>

现在我在 Add_Test() 函数的末尾添加了一个 Remove() 调用(和一个 Add()Remove_Test() 的开头)。这似乎解决了这个问题。由此判断,应该在每个单独的单元测试中释放所有分配的内存。

现在我的问题:

  1. 是否可以在多单元测试中使用分配的内存?
  2. 解决这个问题的最佳方法是什么?

来源.c:

static ST_SOME_STRUCT GlobStruct;

void Add()
{
GlobStruct = util_malloc(sizeof(ST_SOME_STRUCT));
}

void Remove()
{
util_free(&GlobStruct);
}

void DoStuff()
{
//Do stuff using the global structure GlobStruct
}

单元测试.c:

int main( int argc, char **argv )
{
const struct CMUnitTest Test[] =
{
cmocka_unit_test(Add_Test),
cmocka_unit_test(Remove_Test),
};
cmocka_set_message_output( CM_OUTPUT_XML );
return cmocka_run_group_tests( Test, NULL, NULL );
}

static void Add_Test (void** state)
{
expect_value(__wrap_util_malloc, size, sizeof(ST_SOME_STRUCT ));
Add();
}

static void Remove_Test (void** state)
{
expect_not_value(__wrap_util_free, memory, cast_ptr_to_largest_integral_type(NULL));
Remove();
}

Wrappers.c:

void *__wrap_util_malloc(int size)
{
check_expected(size);
return malloc(size);
}

void __wrap_util_free(void *memory)
{
check_expected_ptr(memory);
free(memory);
}

最佳答案

当使用 cmocka_run_group_tests 运行测试时,cmocka 仍将为每个测试运行单独的设置或拆卸函数,以及检查您是否忘记释放 block 的内部函数(因此消息 Add_Test泄露了 1 个区 block )。每次测试后,cmocka 还将释放在该测试中分配的所有 block ,然后再运行下一个测试。

常见的方法是您的每个测试都应该清除在该单个测试中分配的所有内容。如果要在组测试开始时初始化共享状态,请指定组设置/拆卸函数来初始化共享状态(将作为参数传递给每个单元测试),或者使用之前调用的测试设置/拆卸函数每次测试。

与往常一样,拥有全局共享变量不是一个好主意(并且使测试更加困难)。您的 AddRemove 函数(以及所有其他处理此对象的函数)应该接受指向包含数据的结构的指针。

关于c - 在多个 cmocka 单元测试中分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50001508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com