介绍
cmocka作为开源的单元测试工具,基于google发布的cmockery工具,目前被libssh、csync等软件所采用。作为源代码单元测试工具,其功能强大,且方便使用。本文结合单元测试中的一些规范,对于cmokca的使用进行分析和说明。
cmocka基本使用说明
cmocka基于google的单元测试工具cmockery,其主要功能有:
- 内存操作检查
- 模拟函数返回值
- 函数入参检查
- 不同类型的验证宏定义
cmocka作为独立的工具,编译安装之后通过lib库方式进行调用。为了便于使用,在测试过程中,也可以直接将cmocka中的cmocka.c作为源文件,然后在单元测试程序中包含cmocka.h。
1. 内存操作检查
cmocka通过宏定义,将malloc、calloc、free重定向到自己实现的内存操作函数_test_malloc、_test_calloc、_test_free。
记录了内存操作的大小,底层仍然调用了glibc的malloc、calloc、free函数。
2. 模拟函数返回值
在测试模块中,可以通过will_return(function, type)设置模拟函数function的返回值type,然后在模拟函数中,通过mock_type(type)函数得到相应type的值。Cmocka通过维护数据堆栈进行上述操作,即:
mock_type(type)和will_return(function, type)是成对出现的。
通过设定模拟函数中的返回值,避免了对于模拟函数的多次实现。
3. 函数入参检查
程序模块unit.c中的函数func_t运行过程中调用了func_call,func_t根据输入和运行逻辑的不同,在调用func_call是传入的参数不同,可以通过设置func_call对于其参数进行检查,验证func_t在调用func_call之前执行是否正常。
通过check_expected(param)和expect_value(param, value)检查。
4. assert验证函数
cmocka根据不同的数据类型,提供了bool,int,memory addr等不同的验证比较函数。可以针对不同的验证类型,调用不同的函数进行验证。
测试函数定义和执行
cmocka中定义了UnitTest结构体,存放函数名称,函数入口和函数类型。run_tests函数直接执行UnitTest结构体数组,进行单元测试。
cmocka