主要介绍两种为VisualStudio的C++项目创建单元测试的方法:微软的本机单元测试、Google Test。
一、VisualStudio自带的本机单元测试
VisualStudio自带的有一个C++本机单元测试,其框架主要原理是生成一个动态库文件,测试的函数作为DLL的导出函数由框架进行调用测试。
然而实际使用下来体验并不是很好,不过还是简单说下怎么使用。
在解决方案下右键菜单-添加-新建项目,搜索C++项目里的“本机单元测试项目”
具体可以参考微软官方介绍:编写适用于 C/C++ 的单元测试 - Visual Studio | Microsoft Docs
测试发现对于简单的demo小程序没有什么问题,但是对于半路接入单元测试的复杂点的项目就暴露了各种问题(当然最好在项目最初就接入单元测试)。
另外实测发现:测试项目必须引入带测试项目的lib和.obj,某些博客说不用链接,实测不行。
为DLL项目创建单元测试
还是参考微软官方介绍:编写 C++ DLL 单元测试 - Visual Studio | Microsoft Docs
单元测试必须调用不导出的非成员函数,并且代码必须生成为动态链接库 (DLL): 在同一项目中添加单元测试作为产品代码。转到过程在同一项目中添加单元测试的具体步骤。
这个看上去挺适合自己目前的项目的,然而接入下来并不理想,问题后面一并总结。
主要问题
- 配置繁琐
- 好不容易配置成功,测试出现问题,其中无法执行测试是最常见的:
Failed to set up the execution context to run the test.
参考网上的介绍说是,测试DLL所依赖的项目或三方DLL缺失,使用depends查看依赖关系 配置完全后仍然无法运行(测试demo可以,复杂点项目不行)。放弃。
二、使用Google Test
使用下来发现Google Test要简单的多,可以参考微软官方文档:
如何使用适用于 C++ 的 Google Test - Visual Studio | Microsoft Docs
这里说下需要注意的地方,因为C++项目一般使用静态链接库的方式,所以在创建Google Test项目的时候,选项需要注意。
- 将Google Test用作,选择默认的“静态库(.lib)”即可;
- C++运行时库选择:静态链接(也就是MT/MTd),否则就选择:动态链接(推荐)(也就是MD/MDd)。
- 选择要测试的项目(可选):这个勾选要测试的项目名,也可以不选。
在测试项目的属性-链接器-输入-附加依赖项里,配置:…\temp\XXXX\Win32\Debug*.obj
在测试项目的属性-链接器-常规-附加库目录,配置需要链接的三方lib的目录,这个是和被测试项目的配置一致。
编写测试代码:
#include "pch.h"
#include "../XXXX/XXX.h" // 被测试项目的代码
TEST(TestCaseName, TestName) {
EXPECT_EQ(1, 1);
EXPECT_TRUE(true);
// 使用被测试项目的代码
ASSERT_STREQ(_T("xxx.xxx"), _T("xxx.xxx"));
}
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
更多使用方法可以参考:googletest/primer.md at master · google/googletest
总结
- 两种方法都需要引入被测试项目的lib和obj,其中obj可用相对路径加*.obj的方式引入;
- 微软自带本机测试项目生成的是dll形式,不方便;而Google Test生成的是exe形式,方便。
- 微软自带本机测试项目问题较多,特别是Failed to set up the execution context to run the test难以解决。
- Google Test总体配置更简单,问题更少,可以根据项目属性自由选择:静态链接或动态链接;
- Google Test测试项目生成的是exe类型的可执行文件,添加上述的main函数还可以单步调试跟踪,一旦测试出问题可以很方便调试解决。