如何在Visual Studio中对C语言项目进行单元测试与函数Mock
基于Visual Studio 2019的C语言单元测试+Mock最优实现方案
一、解决手动引入生产代码库的繁琐问题
不需要每次新建测试项目都手动配置依赖,通过项目依赖绑定+通用属性表实现一次配置全测试项目复用:
- 首先设置解决方案项目依赖:右键单元测试项目,依次选择【生成依赖项】→【项目依赖项】,勾选对应的productionCode项目,后续生成测试项目时会自动先编译更新生产代码项目,无需手动同步库版本。
- 其次创建通用属性表统一配置引入规则:
- 打开【视图】→【其他窗口】→【属性管理器】,右键任意单元测试项目选择【添加新项目属性表】,命名为
CommonCUnitTest.props保存。 - 打开属性表做三处配置,全部使用相对路径适配不同设备环境:
- 【C/C++】→【常规】→【附加包含目录】:添加生产代码头文件所在路径,示例:
$(SolutionDir)productionCode\inc - 【链接器】→【常规】→【附加库目录】:添加生产项目的lib文件输出路径,示例:
$(SolutionDir)x64\$(Configuration)\ - 【链接器】→【输入】→【附加依赖项】:添加生产代码生成的lib文件名,示例:
productionCode.lib
- 【C/C++】→【常规】→【附加包含目录】:添加生产代码头文件所在路径,示例:
- 后续所有新建的单元测试项目,只需要在属性管理器中右键选择【添加现有属性表】,导入
CommonCUnitTest.props即可复用所有配置,无需重复设置。
- 打开【视图】→【其他窗口】→【属性管理器】,右键任意单元测试项目选择【添加新项目属性表】,命名为
二、兼容VS的C语言单元测试+Mock框架选型
推荐使用Unity + CMock的组合,是C语言领域的主流单元测试方案,完全适配VS2019环境,配置难度低于Fake Function Framework:
- 框架特性:
- Unity是轻量C语言单元测试框架,无额外依赖,语法简单,VS下直接编译即可运行
- CMock是配套Unity的自动Mock生成工具,仅需传入待Mock模块的C头文件,就能自动生成Mock函数代码,无需手动编写Stub逻辑
- VS环境配置步骤:
- 将Unity和CMock的源码放到解决方案的第三方依赖目录,示例路径:
$(SolutionDir)3rdParty\ - 将Unity核心文件
unity.c、unity.h和CMock核心文件cmock.c、cmock.h的路径添加到上面的通用属性表的附加包含目录中,或者直接加入测试项目源码列表 - 需要Mock某模块函数时,通过CMock命令行工具传入对应头文件,自动生成
mock_xxx.c和mock_xxx.h,将生成文件加入测试项目后即可直接调用Mock API,例如xxx_ExpectAndReturn()、xxx_IgnoreAndReturn()等实现Mock逻辑
如果偏好使用Visual Studio原生C单元测试框架也可,利用C/C兼容特性,测试项目用C++编译,生产代码用C编译,Mock可以直接使用适配C函数的gmock库,配置逻辑同样适配上面的通用属性表方案。
- 将Unity和CMock的源码放到解决方案的第三方依赖目录,示例路径:
三、Fake Function Framework调试方案
如果仍想使用FFF,只需做两项配置即可解决运行异常问题:
- 打开单元测试项目属性,在【C/C++】→【预处理器】→【预处理器定义】中添加
FFF_NO_DLSYM=1,关闭Linux平台专属的动态符号查找逻辑,适配Windows静态编译环境 - 待Mock的C函数需要添加
__declspec(noinline)声明,避免VS编译器优化将函数内联,导致Mock替换逻辑失效
内容的提问来源于stack exchange,提问作者Kasper
相关产品推荐
相关产品推荐

