1 初识GoogleTest
首先要了解googletest是做什么的,主要是单元测试框架。第二是googletest有什么优势:
- 测试过程独立可以重复;
- 测试组织与代码结构保持比较好的一致性;
- 支持跨平台;
- 失败后能够提供完整错误信息,同时支持失败后继续测试其他案例;
- 可以自动运行所有套件,测试者更多的关注测试内容;
- 支持桩模式,减少测试成本提高测试效率 ;
2 下载和安装
下载地址:
git clone https://github.com/google/googletest.git
安装:
cd googletest
cmake CMakeLists.txt
make
make install
3 实例运行
g++ sample1.cc sample1_unittest.cc -o sample1_unittest -lgtest -lgtest_main -lpthread
./sample1_unittest
这里做下基本的解释:libgtest.a是必须加载的库,主要是进行gtest测试框架的核心API,libgtest_main.a主要是实现了main函数,给没有main函数的代码简化测试过程,包括main函数和初始化等操作。同时google支持多线程操作,下图是 测试结果,整体比较清晰。
4 整体介绍
4.1 整体目录结构
包含两大组件:分别是googletest和googlemock
-googletest
---docs//操作手册
---googlemock//锚测试组件,它包含了基础测试组件
---googletest//基础测试组件
-----samples//示例涵盖了基本的用法
---lib//生成的静态库文件
4.2 基本语法
4.2.1 断言
布尔比较
这个比较简单,需要注意的是expect可以继续执行下一个用例,assert则是终止测试
EXPECT_TRUE
EXPECT_FALSE
ASSERT_TRUE
ASSERT_FALSE
二元比较
EXPECT_EQ //等于判断
EXPECT_NE//不等于判断
EXPECT_LT//小于判断
EXPECT_LE//小于等于判断
EXPECT_GT//大于判断
EXPECT_GE//大于等于判断
4.2.2 函数测试
函数测试用TEST搞定,其中第一个参数是字符串:套件名称自己定;第二个参数是字符串::测试用例自己定。
TEST(FactorialTest, Negative)
4.2.3 类测试
类测试通常基本步骤是,默认构造函数测试,带参数构造,拷贝构造,方法测试四个部分。
TEST(MyString, DefaultConstructor) //默认构造
TEST(MyString, ConstructorFromCString)//参数构造
TEST(MyString, CopyConstructor) //拷贝构造
TEST(MyString, Set) //方法测试
4.2.4 测试夹具
多个类组合测试时会用到夹具测试:需要继承自 testing::Test
其中重写SetUp负责初始化资源;TearDown负责释放资源
TEST_F进行用例测试
同时支持测试用例继承复用
class QueueTestSmpl3 : public testing::Test
{
void SetUp() override { ... }//测试前:初始化资源
void TearDown() override { ... }//测试后:释放资源
}
//测试
TEST_F(FooTest, Bar) { ... }
//支持复用
class QueueTestSmpl4: public QueueTestSmpl3{
};
4.2.5 测试枚举
主要用于对于具有继承关系的类测试相同的方法。
枚举支持多个类同时测试
TYPED_TEST_SUITE 第一个参数为夹具类;第二参数为枚举类型
typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable> Implementations;
TYPED_TEST_SUITE(PrimeTableTest, Implementations);
//测试
TYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes)
4.2.6 事件测试
主要是用于测试中需要增加对于测试前后信息的补充,不采用标准输出,而是自身定义的一些错误信息;在测试比较常用的几个点:单元测试前,单元测试后,套件测试前,套件测试后,用例测试前,用例测试后。
具体操作:首先是继承自EmptyTestEventListener类;第二步是根据需要重写对应函数
class TersePrinter : public EmptyTestEventListener
//单元测试前/后
void OnTestProgramStart(const UnitTest& /* unit_test */) override;
void OnTestProgramEnd(const UnitTest& unit_test) override ;
//套件测试前/后
OnTestSuiteStart(const TestSuite& parameter) override;
void OnTestSuiteEnd(const TestSuite& parameter) override;
//用例测试前/后
void OnTestCaseStart(const TestSuite& parameter) override;
void OnTestCaseEnd(const TestCase& parameter) override;