怎么利用gtest和gmock进行单元测试
1.软件安装这里笔者选择的是 googletest-release-1.5.0 这个版本,去github上下载即可。下载完解压后,利用cmake生成makefile文件,再执行makecmake CMakeLists.txtmake会在当前目录下生成两个.a文件 libgtest.a libgtest_main.a,将这两个文件放置于系统环境下sudo cp libgtest*.a/usr/lib
1.软件安装
这里笔者选择的是 googletest-release-1.5.0 这个版本,去github上下载即可。下载完解压后,利用cmake生成makefile文件,再执行make
cmake CMakeLists.txt
make
会在当前目录下生成两个.a文件 libgtest.a libgtest_main.a,将这两个文件放置于系统环境下
sudo cp libgtest*.a /usr/lib
sudo cp –a include/gtest /usr/include
2.DEMO测试
这时再写一个demo测试一下我们的环境是否搭建好了,编译如下代码
g++ gtest.cpp -o gtest -lgtest -lpthread //注意链接库的顺序有要求 反过来无法编译通过
#include<gtest/gtest.h>
/*这个相当于业务代码*/
int add(int a,int b){
return a+b;
}
TEST(mytest,test_add)
{
EXPECT_EQ(add(100,100),200);
}
/*gtest的main函数入口*/
int main(int argc,char **argv){
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
执行后会有如下结果
3.问题延伸
思考这样一个问题,如果我们不是在实际的生产环境,而是在虚拟环境进行测试,那么一部分接口调用实际上是无法调用成功的,比如驱动提供的接口之类的。那么意味着我们的TEST用例就一定会失败,那么应该如何解决这个问题呢?
如下,test_WriteBufTofile这个测试用例就始终无法正常执行
#include<gtest/gtest.h>
#include <unistd.h>
#include <stdio.h>
/*这个相当于业务代码*/
bool FileExit(const char *pfilename)
{
if(!pfilename)
return false;
if(access(pfilename,F_OK) == 0)
return true;
return false;
}
bool WriteBufTofile(const char * pfilename ,const char *p ,int len)
{
if(!FileExit(pfilename))
return false;
//write buf to file 这里不做实现
//do what you want
return true;
}
TEST(mytest,test_WriteBufTofile)
{
const char *pbuf = "Hello World!";
int len = strlen(pbuf);
EXPECT_EQ(WriteBufTofile("/home/zjx/test.cpp",pbuf,len),true);
}
/*gtest的main函数入口*/
int main(int argc,char **argv){
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
发现这个TEST失败的原因是,文件始终不存在。可能比喻不太恰当,但是实际情况就是这样,一些接口在虚拟的测试环境下执行并不能得到我们想要的结果,那么如果我又想方TEST用例跳过 FileExit 文件顺利执行,我应该怎么办呢?
函数打桩
引入打桩的概念,极大的方便了单元测试
安装mockcpp
安装确保服务器具有cmak
- 将mockcpp的源代码和gtest的源码全部下载下来
- cmake -DMOCKCPP_XUNIT=gtest -DMOCKCPP_XUNIT_HOME=/home/googletest-release-1.7.0 ./
DMOCKCPP_XUNIT_HOME指向gtest代码目录, - 利用生成的makefile make && make install安装到本地环境,也可以把编译完成的.a文件和.h头文件手动拷贝到系统环境中。
安装完成后,引入只需要在源码中包含头文件,编译时加上编译选项
-lmockpp即可
#include <mockcpp/mockcpp.h>
#include <mockcpp/mockcpp.hpp>
使用mockcpp打桩函数
利用mock函数进行打桩,原本无法正常进行的测试用例在使用mock对FileExit函数进行打桩后顺利往下跑。
#include<gtest/gtest.h>
#include <mockcpp/mockcpp.h>
#include <mockcpp/mockcpp.hpp>
#include <unistd.h>
#include <stdio.h>
/*这个相当于业务代码*/
bool FileExit(const char *pfilename)
{
if(!pfilename)
return false;
if(access(pfilename,F_OK) == 0)
return true;
return false;
}
bool WriteBufTofile(const char * pfilename ,const char *p ,int len)
{
if(!FileExit(pfilename))
return false;
//write buf to file 这里不做实现
//do what you want
return true;
}
TEST(mytest,test_WriteBufTofile)
{
const char *pbuf = "Hello World!";
int len = strlen(pbuf);
MOCKER(FileExit).stubs().will(returnValue(true));
EXPECT_EQ(WriteBufTofile("/home/zjx/test.cpp",pbuf,len),true);
}
/*gtest的main函数入口*/
int main(int argc,char **argv){
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
/*正确的做法应该是先写用例,再进行代码编写,直到代码能够编译通过为止*/
编译后执行
参考文献:
参考文献
更多推荐
所有评论(0)