我正在尝试使用 cmocka 对一些源代码进行单元测试。基本上(相关的)源代码看起来类似于 Source.c。
单元测试分别调用每个函数。在测试Add()函数时,此函数最终将调用单元测试包装的util_malloc()(此函数通常在 malloc 之前检查 0 大小)。在 Wrappers.c 中的包装函数__wrap_util_malloc()中,首先检查预期大小,然后使用 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()调用(并在Remove_Test()的开头添加了一个Add( ) )。这似乎可以解决问题。从这一点来看,应该在每个单独的单元测试中释放所有分配的内存。
现在我的问题:
- 是否可以在多个单元测试中使用分配的内存?
- 解决这个问题的最佳方法是什么?
来源.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();
}
包装器.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);
}