多cmocka单元测试中的内存分配问题咨询
使用CMocka进行单元测试的实践细节
刚好我也在用CMocka对类似Source.c结构的源码做单元测试,来给你梳理下这套流程的关键细节:
核心测试思路:我们的目标是单独调用每个目标函数做隔离测试——比如测试
Add()函数时,它最终会触发调用我们已经封装好的util_malloc()函数(这个原函数本身就会在调用malloc前检查申请的内存大小是否为0)。Wrappers.c中__wrap_util_malloc()的封装实现:这个wrap函数的作用是在真实分配内存前,先校验内存申请大小是否符合测试预期,再执行真实的内存分配。举个实际的代码示例:
#include <stdlib.h> #include <cmocka.h> void *__wrap_util_malloc(size_t size) { // 验证申请的内存大小是否和测试用例的预期一致 assert_int_equal(size, mock_type(size_t)); // 调用真实的malloc完成内存分配 return malloc(size); }
在测试Add()的用例里,我们只需要通过will_return(__wrap_util_malloc, EXPECTED_MEM_SIZE)来预设预期的申请大小,就能确保Add()在调用util_malloc时传入的参数是正确的。
- 后续测试
Remove()函数的通用思路:针对Remove()这类涉及内存释放的函数,我们可以复用CMocka的wrap机制,比如实现__wrap_util_free()函数,在里面验证被释放的指针是否符合预期,或者统计释放操作的执行次数,以此来校验Remove()的内存管理逻辑是否正确。
内容的提问来源于stack exchange,提问作者Maartn
相关产品推荐
相关产品推荐

