centos上gtest安装与使用

gtest安装

dnf源更新

shell中输入以下命令:

sudo yum install epel-release
sudo yum install dnf

安装gtest

shell中输入以下命令即可:

sudo dnf install dnf-plugins-core
sudo dnf install gtest gtest-devel

这个时候,我们输入命令以下命令就可以看到gtest.h这个头文件了:

sudo find /usr -name gtest.h
/usr/include/gtest/gtest.h

gtest的使用

TEST宏

TEST宏函数原型如下:

/**
 * @brief gtest中最基本的测试模块
 * @param test_case_name C++中填写要测试的成员函数,C语言中随意填写,尽可能有意义
 * @param test_name C++最好填写${测试成员函数名}_test,C语言中${测试函数名}_test
 */
TEST(test_case_name, test_name)
{
	....
}

其是gtest中最基本的模块,除了TEST之外还有TEST_FTEST_P这些宏,用法也都不同,等下会介绍。现在的目光转回TEST,我们可以把它理解为一个函数,函数里面是具体的测试语句,下面看一个简单的demo:

#include <gtest/gtest.h>
using namespace std;

int abs(int x) { return x > 0 ? x : -x; }

TEST(abs_test, abs_1) { ASSERT_TRUE(abs(1) != 1); }

int main(int argc, char *argv[]) {
  testing::InitGoogleTest(&argc, argv);  //将命令行参数传递给gtest
  return RUN_ALL_TESTS(); // RUN_ALL_TESTS()运行所有测试案例
}

这段代码首先会根据命令行参数初始化gtest,之后的函数RUN_ALL_TESTS会调用我们编写的TEST模块,执行abs_test中的语句。我们编译运行一下这个cpp文件看一下效果:

[ik@localhost EasyYQ]$ g++ -lgtest -o test test.cpp
[ik@localhost EasyYQ]$ ./test 

在这里插入图片描述

全局事件

gtest提供全局事件,在测试模块前和测试模块后分别有两次机会让用户执行自己定义的函数。这需要我们定义一个环境变量类并且继承testing::Environment,之后重写这个类的下面这两个函数:

  • SetUp
  • TearDown

下面是一个demo:

class GlobalTest : public testing::Environment {
 public:
  virtual void SetUp() { cout << "excute before" << endl; }

  virtual void TearDown() { cout << "excute after" << endl; }
};

int abs(int x) { return x > 0 ? x : -x; }
int add(int a, int b) { return a + b; }

TEST(GlobalTest, abs) { ASSERT_EQ(abs(1), abs(-1)); }

TEST(GlobalTest, add) { ASSERT_TRUE(add(2, 3) == 4); }

int main(int argc, char *argv[]) {
  testing::InitGoogleTest(&argc, argv);  //将命令行参数传递给gtest

  //# 下面的函数在这两句代码是使用全局事件必备的
  testing::Environment *env = new GlobalTest(); 
  testing::AddGlobalTestEnvironment(env);
  return RUN_ALL_TESTS();  // RUN_ALL_TESTS()运行所有测试案例
}

在这里插入图片描述

TEST_F 宏

TEST_F宏的使用需要按照C++的风格定义类,这个类需要继承自testing::Test并且重写这四个成员函数:

  • SetUpTestCase
  • TearDownTestCase
  • SetUp
  • TearDown

假如说我们有多个测试模块,那么SetUpTestCase就会在所有模块之前执行,TearDownTestCase会在所有模块之后执行;SetUp会在单个模块之前执行,TearDown会在单个模块之后执行。详情看下面的例子:

#include <gtest/gtest.h>
#include <iostream>
#include <vector>
using namespace std;

class GlobalTest:public testing::Test
{
  public:
    static void SetUpTestCase()
    {
      cout << "GlobalTest::SetUpTestCase()" << endl;
    }

    static void TearDownTestCase()
    {
      cout << "GlobalTest::TearDownTestCase()" << endl;
    }

    virtual void SetUp()
    {
      cout << "GlobalTest::SetUp()" << endl;
    }

    virtual void TearDown()
    {
      cout << "GlobalTest::TearDown()" << endl;
    }
  protected:
    vector<int> vec;
};

TEST_F(GlobalTest, GlobalClassTest1) { EXPECT_EQ(0, vec.size()) << "expect_eq error"; }

TEST_F(GlobalTest, GlobalClassTest2) {
  ASSERT_TRUE(vec.size()==0);
}

int main(int argc, char *argv[]) {
  testing::InitGoogleTest(&argc, argv);  //将命令行参数传递给gtest
  return RUN_ALL_TESTS(); // RUN_ALL_TESTS()运行所有测试案例
}

在这里插入图片描述


TEST_F在这种用法下可以直接访问TEST类的子类的除了private修饰的其他资源
这也是TEST_F和TEST的区别之一

单元测试断言

gtest中单元测试主要都是依靠两中断言实现的:

  • ASSERT_*:这种断言在出现与期待不一致的情况下会停止运行
  • EXCEPT_*:这种断在在出现与期待不一致的情况会继续往下运行

ASSERT断言

在TEST模块中,我们可以使用ASSERT断言来断言一个函数的执行结果,像上面demo的例子ASSERT_TRUE(abs(1) != 1);就是断言ASSERT_TRUE函数abs的返回值为1。gtest除了支持ASSERT_TRUE之外还有其他的断言函数,具体如下(引用自博主linhai1028
):

bool值检查
ASSERT_TRUE(参数),期待结果是true
ASSERT_FALSE(参数),期待结果是false

数值型数据检查
ASSERT_EQ(参数1,参数2),传入的是需要比较的两个数 equal
ASSERT_NE(参数1,参数2),not equal,不等于才返回true
ASSERT_LT(参数1,参数2),less than,小于才返回true
ASSERT_GT(参数1,参数2),greater than,大于才返回true
ASSERT_LE(参数1,参数2),less equal,小于等于才返回true
ASSERT_GE(参数1,参数2),greater equal,大于等于才返回true

字符串检查
ASSERT_STREQ(expected_str, actual_str),两个C风格的字符串相等才正确返回
ASSERT_STRNE(str1, str2),两个C风格的字符串不相等时才正确返回
ASSERT_STRCASEEQ(expected_str, actual_str)
ASSERT_STRCASENE(str1, str2)
EXPECT_系列,也是具有类似的宏结构的

EXCEPT断言

真假判断
EXPECT_TRUE(ret):ret == true
EXPECT_FALSE(ret):ret == false

等于不等于
EXPECT_EQ(expected, actual):expected == actual
EXPECT_NE(expected, actual):expected != actual
EXPECT_FLOAT_EQ(expected, actual):(float)expected == actual
EXPECT_DOUBLE_EQ(expected, actual):(double)expected == actual
EXPECT_NEAR(var1, var2, tol):abs(var1 - var2) <= tol

大于小于
EXPECT_LT(var1, var2):var1 < var2
EXPECT_GT(var1, var2):var1 > var2
EXPECT_LE(var1, var2):var1 <= var2
EXPECT_GE(var1, var2):var1 >= var2

字符串判断
EXPECT_STREQ(s1, s2):s1 == s2
EXPECT_STRNE(s1, s2):s1 != s2
EXPECT_STRCASEEQ(s1, s2):s1 == s2
EXPECT_STRCASENE(s1, s2):s1 != s2

参考文献

[1] louyang.如何在CentOS 8 上安装GTest[OL].https://www.jianshu.com/p/f143e245d6ec
[2] linhai1028.gtest的介绍和使用.https://blog.csdn.net/linhai1028/article/details/81675724

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenmingik

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值