一.什么是GTest?
GTest是一个跨平台的 C++单元测试框架,由google公司发布。gtest是为了在不同平台上为编写C++单 元测试而生成的。
二.使用
TEST(test_case_name, test_name):主要用来创建⼀个简单测试, 它定义了一个测试函数, 在这个函数中可以使⽤任何C++代 码并且使用框架提供的断言进行检查
TEST_F(test_fixture,test_name):主要用来进行多样测试,适用于多个测试场景如果需要相同的数据配置的情况, 即相同 的数据测不同的行为
1.宏断言
gtest的宏断言分为两类:
ASSERT_系列:如果当前点检测失败则退出当前函数
EXPECT_系列:如果当前点检测失败则继续往下执行
// 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
#include <iostream>
#include <gtest/gtest.h>
using std::cout;
using std::endl;
/*
断言宏的使用
ASSERT_ 断言失败则退出
EXPECT_ 断言失败继续运行
注意:
断言宏,必须在单元测试宏函数中使用
*/
//Test1是测试套件名称,greater和less是测试用例名称,测试套件Test1包含greater和less两个测试用例
TEST(Test1, greater)
{
int age = 20;
EXPECT_GT(age, 20);
cout << "测试完毕" << endl;
}
TEST(Test1, less)
{
int age = 20;
EXPECT_LE(18, 20);
cout << "测试完毕" << endl;
}
TEST(Test2, greater)
{
int age = 20;
EXPECT_GT(age, 20);
cout << "测试完毕" << endl;
}
TEST(Test2, less)
{
int age = 20;
EXPECT_LE(18, 20);
cout << "测试完毕" << endl;
}
int main(int argc, char* argv[])
{
//将命令⾏参数传递给gtest
testing::InitGoogleTest(&argc, argv);
//运行所有测试
RUN_ALL_TESTS();
return 0;
}
2.事件机制
(1)什么是事件机制
测试框架:
GTest中的事件机制是指在整个测试的前和后,测试套件的前和后,以及测试用例的前和后,提供给用户自行添加操作的机制。
事件机制的最大好处就是,能够为我们的测试提前准备好测试环境,并在测试完毕后销毁环 境,使得测试更加灵活
(2)事件分类
GTest提供的事件有以下三类:
全局事件:针对整个测试程序,整个测试前后会触发该事件
TestSuit(套件)事件:针对一个测试套件,测试套件测试前后会触发该事件
TestCase(用例)事件,针对一个测试用例,测试用例测试前后会触发该事件
(3)事件的实现方法
GTest中的事件都是通过定义类中的方法来实现的,由于事件给测试提供了测试环境,我们不妨将这样的类叫做测试环境类。
实现全局事件——重写SetUp和TearDown
实现一个类,继承testing::Environment,然后重写SetUp和TearDown方法,最后在测试开始前调用testing::AddGlobalTestEnvironment方法注册该全局环境类。
实现TestSuit事件——实现SetUpTestCase(静态)和TearDownTestCase(静态)
实现一个类,继承testing::Test,实现SetUpTestCase和TearDownTestCase静态方法。
注意:要使用TEST_F定义测试函数,测试套件名称必须和类名一致,这样才能将测试套件和环境类关联起来,环境类中定义的成员,测试函数中可以访问。
实现TestCase事件——重写SetUp和TearDown
在测试套件对应的测试环境类中,重写SetUp和TearDown方法。
#include <iostream>
#include <gtest/gtest.h>
#include <list>
using std::cout;
using std::endl;
class GlobalTestEnvironment : public testing::Environment
{
public:
virtual void SetUp() override
{
cout << "全局测试环境初始化" << endl;
}
virtual void TearDown() override
{
cout << "全局测试环境销毁" << endl;
}
};
class ListTestSuit : public testing::Test
{
public:
static void SetUpTestCase()
{
cout << "测试套件ListTestSuit测试环境初始化" << endl;
}
static void TearDownTestCase()
{
cout << "测试套件ListTestSuit测试环境销毁" << endl;
}
virtual void SetUp() override
{
_lt = {1, 2, 3, 4};
cout << "测试用例的测试环境初始化" << endl;
}
virtual void TearDown() override
{
_lt.clear();
cout << "测试用例的测试环境销毁" << endl;
}
public:
std::list<int> _lt;
};
//测试套件名称必须和类名保持一致
TEST_F(ListTestSuit, testcase1)
{
_lt.push_back(5);
ASSERT_EQ(5, _lt.back());
}
TEST_F(ListTestSuit, testcase2)
{
_lt.push_back(6);
ASSERT_EQ(1, _lt.front());
}
int main(int argc, char* argv[])
{
//将命令⾏参数传递给gtest
testing::InitGoogleTest(&argc, argv);
//注册全局测试环境类
testing::AddGlobalTestEnvironment(new GlobalTestEnvironment);
//运行所有测试
RUN_ALL_TESTS();
return 0;
}