C-在多个CMOCKA单元测试中分配的内存



我正在尝试使用cmocka对某些源代码进行单位测试。基本上(相关的(源代码看起来类似于源。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(( function末尾添加了 remove((调用(和 add(( emove_test(((的开头。这似乎解决了问题。从此来看,应该在每个单独的单元测试中释放所有分配的内存。

现在我的问题:

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

source.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
}

unit_test.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仍将为每个测试运行单个设置或拆卸功能,以及其内部功能,这些功能检查您是否忘记了自由块(因此消息Add_Test leaked 1 block(s)(。每次测试之后,CMOCKA还将在运行下一个测试之前释放分配了该测试的任何块。

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

一如既往,拥有全局共享变量是一个坏主意(并且使测试变得更加困难(。您的AddRemove功能(以及所有其他处理此对象的其他处理(应接受指向包含数据的结构的指针。

相关内容

  • 没有找到相关文章

最新更新