下面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);
}