下面Gtest是在arm-linux下运行的
https://download.csdn.net/download/qq_31868891/89729426
一、下载编译
1.下载gtest代码
https://github.com/google/googletest
2.配置编译
vscode安装CMake Tools
将上面下载的gtest代码文件夹拖到vscode里,然后选择对应的CMakeLists.txt
如下根据自己需求修改编译的gcc版本
选择好gcc版本点击编译
编译后会在build/lib下生成静态库文件
二、使用
建一个Gtest文件夹
把编译生成的lib文件夹复制Gtest文件夹
把googletest-main./googletest-main/googletest/include/下gtest文件夹复制到Gtest文件夹
把googletest-main./googletest-main/googlemock/include/下gmock文件夹复制到Gtest文件夹
编译时要带 -LGtest/lib -lgtest -lgtest_main -lgmock -lgmock_main
gtest 使用
int Targetfun::printfint(int n)
{printf("%d\n", n);return n;
}//成功
TEST_F(UnitTest, printfint1)
{ int ret = printfint(1); EXPECT_EQ(ret, 1);
}
//失败
TEST_F(UnitTest, printfint2)
{ int ret = printfint(2); EXPECT_EQ(ret, 1);
}
gmock 模拟返回值使用
如下假设printint函数依赖别的硬件无法运行,可以用mock让函数直接返回275,即printffun返回false。mock替换要先把 printfint定义为虚函数
virtual int printfint(int n);bool Targetfun::printffun(int n)
{printf("Target fun\n");int a = printfint(n);if (a > 256){printf("%d>256\n", a);return false;}printf("%d<=256\n", a);return true;
}//测试代码
class UnitTest : public ::testing::Test, public Targetfun
{
public:void SetUp();void TearDown();public:MOCK_METHOD(int, printfint, (int n));//用于gmock模拟函数
};//如下通过mock让代码返回275
TEST_F(UnitTest, printffun2)
{int n = 2;EXPECT_CALL(*this, printfint(n)).WillOnce(::testing::Return(257));bool ret = printffun(n);EXPECT_EQ(ret, false);
}
gmock 替换虚函数注意
如下因为虚函数被mock替换执行会失败,可以参考printfint4在函数前加类
class UnitTest : public ::testing::Test, public Targetfun
{
public:void SetUp();void TearDown();public:MOCK_METHOD(int, printfint, (int n));
};//失败
TEST_F(UnitTest, printfint3)
{int ret = printfint(3);EXPECT_EQ(ret, 3);
}
//成功
TEST_F(UnitTest, printfint4)
{int ret = Targetfun::printfint(4);EXPECT_EQ(ret, 4);
}
函数运行条件
如下测试CalcSum函数要提前初始化m_pCalcSum结构体
//如下m_pCalcSum是指针要提前初始化,不能为null
int Targetfun::CalcSum(int a, int b, int *sum)
{m_pCalcSum->sum = a + b;*sum = m_pCalcSum->sum;printf("%d\n", m_pCalcSum->sum);return m_pCalcSum->sum;
}//如下5是放函数里赋值,6是放SetUp里
//可以粗滤认为SetUp与TearDown()是UnitTest类的构造与析构函数
void UnitTest::SetUp()
{// 在每个测试案例开始前设置测试环境 m_pCalcSum = &m_CalcSum;
}void UnitTest::TearDown()
{// 在每个测试案例结束后清理测试环境
}TEST_F(UnitTest, printfint5)
{int sum;S_CalcSum mCalcSum;m_pCalcSum = &mCalcSum;int ret = Targetfun::CalcSum(4, 5, &sum);printf("mCalcSum:%d m_CalcSum:%d\n", mCalcSum.sum,m_CalcSum.sum);EXPECT_EQ(ret, 9);EXPECT_EQ(sum, 9);
}TEST_F(UnitTest, printfint6)
{int sum; int ret = Targetfun::CalcSum(8, 9, &sum);EXPECT_EQ(ret, 17);EXPECT_EQ(sum, 17);
}
gmock 模拟函数参数(指针)返回
int Targetfun::CalcSum(int a, int b, int *sum)
{m_pCalcSum->sum = a + b;*sum = m_pCalcSum->sum;printf("%d\n", m_pCalcSum->sum);return m_pCalcSum->sum;
}bool Targetfun::CalcSumfun(int a, int b)
{int sum;CalcSum(a, b, &sum);printf("%d\n", sum);if (sum > 10){return true;}return false;
}//测试
//参数占位 testing::_
//<2>设置第2个参数返回值 testing::SetArgPointee<2>(sum)
//<num> num =0,1,2....
TEST_F(UnitTest, printfint7)
{int sum=15; EXPECT_CALL(*this, CalcSum(testing::_, testing::_, testing::_)).WillOnce(testing::DoAll(testing::SetArgPointee<2>(sum), testing::Return(sum)));bool ret = Targetfun::CalcSumfun(5, 15);EXPECT_EQ(ret, true);
}