文章目录
- gtest安装
- dnf源更新
- 安装gtest
- gtest的使用
- TEST宏
- 全局事件
- TEST_F 宏
- 单元测试断言
- ASSERT断言
- EXCEPT断言
- 参考文献
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_F
和TEST_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
参考文献
louyang.如何在CentOS 8 上安装GTest[OL].https://www.jianshu.com/p/f143e245d6ec