gmock是google公司推出的一款开源的白盒测试工具。gmock是个很强大的东西,测试一个模块的时候,可能涉及到和其他模块交互,可以将模块之间的接口mock起来,模拟交互过程。其作用就类似白盒测试中的打桩的概念。google 开源的跨平台C++单元测试框架,是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。
Google Mock(简称gmock)是Google在2008年推出的一套针对C++的Mock框架,它灵感取自于jMock、EasyMock、harcreat。它提供了以下这些特性:
gmock官网:https://github.com/google/googletest。
官方文档:http://google.github.io/googletest/。
截止到2022年2月,目前有三个发行版本(release):
由于v1.10.0,v1.11.0以及之后的版本都不存在msvc,需要利用CMake进行编译,因此为简单起见,本文选择的版本是v1.8.1,有需要的也可以在这里进行下载:v1.8.1。
打开Visual Studio,进入googletest-release-1.8.1\googlemock\msvc\2015目录下,运行gmock.sln解决方案。
编译gmock需要注意以下两点:
①解决方案的平台与目标程序一致,这里选择的是x64;
②版本也要与目标程序一致,这里选择的是release版本;
设置完成后,右键这三个项目——>生成,进行编译。
编译完成后,会在googletest-release-1.8.1\googlemock\msvc\2015\x64-Release文件夹下生成若干个文件,我们只需要gmock.lib文件(我编译的是release版),如下图所示。
将googletest-release-1.8.1\googlemock\include目录下的include文件夹内容和googletest-release-1.8.1\googletest\include目录下的include文件夹内容拷贝到我们的目标程序文件夹中,这里面是我们需要的头文件;在目标程序的属性里面设置头文件的包含目录。
设置lib文件的库目录(将.lib文件放在一个单独的文件夹中)如下图所示。
将lib文件填入附加依赖项:
右键——>属性——>链接器——>输入——>附加依赖项——>加入gmock.lib,如下图所示。
编写代码之前,首先需要将解决方案的平台与目标程序一致,这里选择的是x64,然后版本也要与目标程序一致,这里选择的是release版本。
新建一个头文件,命名为Add.h,实现数值相加的功能,代码如下:
#pragma once
int Add(int i, int j)
{
return i + j;
}
源程序demo.cpp代码如下:
#include "Add.h"
#include "gmock/gmock.h"
TEST(Add, 负数) {
EXPECT_EQ(Add(-1, -2), -3); //相等
EXPECT_GT(Add(-4, -5), -6); //大于(会报错)
}
TEST(Add, 正数) {
EXPECT_EQ(Add(1, 2), 3); //相等
EXPECT_GT(Add(4, 5), 6); //大于
}
int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);//注册需要运行的所有测试用例
return RUN_ALL_TESTS(); //执行测试,成功返回0失败返回1
}
代码中,测试用例 Add包含两个测试,正数和负数(这里利用了Visual C++ 2005以上允许标识符包含Unicode字符的特性)。
在控制台界面中,通过的测试用绿色表示,失败的测试用红色表示。每个测试的启动用RUN表示,测试的结果用OK(测试成功)或FAILED(测试失败)表示。失败的测试会在RUN和FAILED中间打印输出错误代码行和原因。在最后一个双横线下方(==)显示所有用例和测试统计结果(测试数量、耗时成功测试数量、失败测试数量等)。
如果读者也像我这样配置,很有可能会遇到这个问题:
错误 LNK2038 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(demo3.obj 中) demo3 E:\ProjectTest\demo3\demo3\gmock.lib(gtest-all.obj)
错误原因:在release下,工程设置中运行库中设置成了"多线程调试 DLL (/MD)"。这个是设置应该是在debug下的设置,release下应该设置“多线程 DLL (/MT)”,如下图所示:
ok,经过如上配置,应该就没有问题了。
如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/82936133
以上便是本文的全部内容了,整理不易,如果对你有所帮助,记得点个赞哟~
参考: