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();
}

执行后会有如下结果
gtestdemo执行结果
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();
}

gtest执行结果
发现这个TEST失败的原因是,文件始终不存在。可能比喻不太恰当,但是实际情况就是这样,一些接口在虚拟的测试环境下执行并不能得到我们想要的结果,那么如果我又想方TEST用例跳过 FileExit 文件顺利执行,我应该怎么办呢?
函数打桩
引入打桩的概念,极大的方便了单元测试
安装mockcpp
安装确保服务器具有cmak

  1. 将mockcpp的源代码和gtest的源码全部下载下来
  2. cmake -DMOCKCPP_XUNIT=gtest -DMOCKCPP_XUNIT_HOME=/home/googletest-release-1.7.0 ./
    DMOCKCPP_XUNIT_HOME指向gtest代码目录,
  3. 利用生成的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();
}

/*正确的做法应该是先写用例,再进行代码编写,直到代码能够编译通过为止*/

编译后执行
在这里插入图片描述

参考文献:
参考文献

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐