首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个cmocka单元测试中分配的内存

在多个cmocka单元测试中分配的内存
EN

Stack Overflow用户
提问于 2018-04-24 12:19:04
回答 1查看 1K关注 0票数 1

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

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

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

在运行测试时,cmocka返回以下失败:

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

代码语言:javascript
复制
<failure><![CDATA[EXCEPTION_ACCESS_VIOLATION occurred at 004060af.
To debug in Visual Studio... [...]
]]></failure>

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

现在我的问题是:

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

资料来源c:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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();
}

C.c:

代码语言:javascript
复制
void *__wrap_util_malloc(int size)
{
    check_expected(size);
    return malloc(size);
}

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-24 12:51:47

当使用cmocka_run_group_tests运行测试时,check仍然会为每个测试运行单独的安装或解压函数,以及它的内部函数,这些函数检查您是否忘记释放块(因此是消息Add_Test leaked 1 block(s))。每次测试之后,在运行下一个测试之前,cmocka还将释放在该测试中分配的任何块。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50001508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档