首先构建
选择最适合当前编译器版本的GTest。
Linux
官方的构建环境(未测试):gcc 5.0+,CMake
Windows
CMake版本:3.8.0-rc2
- MSVC2013 -> V1.8.1
- MSVC2015 -> V1.10
- 更多未尝试
断言
GTest
使用断言(assertion)来测试代码是否符合预期,断言结果分别有:
- success:成功;
- non-fatal failture:失败但继续;
- fatal failture:失败并崩溃(crash)。
GTest
提供EXPECT_*
和ASSERT_*
实现断言。
EXPECT_*
提供success
与non-fatal failture
两个结果,在实际单元测试中也更推荐使用。
而ASSERT_*
提供的success
和fatal-failture
,在出现失败后,程序会直接崩溃,导致内存、文件资源未释放,引发不可预料的问题。
一元比较
ASSERT | EXPECT | 验证 |
---|---|---|
ASSERT_TRUE(condition) | EXPECT_TRUE(condition) | condition为真 |
ASSERT_FALSE(condition) | EXPECT_FALSE | condition为假 |
二元比较
Col1 | Col2 | Col3 |
---|---|---|
ASSERT_EQ(val1, val2) | EXPECT_EQ(val1, val2) | va1 == val2 |
ASSERT_NE(val1, val2) | EXPECT_NE(val1, val2) | val != val2 |
ASSERT_LT(val1, val2) | EXPECT_LT(val1, val2) | val1 < val2 |
ASSERT_LE(val1, val2) | EXPECT_LE(val1, val2) | val1 <= val2 |
ASSERT_GT(val1, val2) | EXPECT_GT(val1, val2) | val1 > val2 |
ASSERT_GE(val1, val2) | EXPECT_GE(val1, val2) | val1 >= val2 |
快速开始
首先,假设需要验证一个数是否为质数,创建函数bool isPrimeNumber(int number);
1 | // prime.h |
1 | // prime.cpp |
1 | // main.cpp |
使用testing::InitGooleTest
初始化框架,并调用RUN_ALL_TESTS
运行所有测试,测试结果如下:
1 | [==========] Running 1 tests from 1 test suites. |
此外,在TEST
宏函数中,也是可以完成定义变量之类的操作,比如测试一个MyString
的复制构造函数(copy constructor)是否正常:
1 | constexpr char str[] = "Hello World"; |
TEST_F
GTEST中不仅有简单的断言测试,还有更为高级的text fixture
,即TEST_F(TestFixtureName, TestName)
。
fixture
,其为固定的设置,即在测试中为每个TEST
都执行一个同样的操作。
当需要测试一个容器的功能时,每次都需要对其进行填充,如果使用TEST
,则每次都需要定义一个对象,并对其填充,显得很冗余,繁琐。
TEST_F
则可以简化这一过程,他的1st parm TestFixtureName
是一个类,需要继承自testing::Test
,同时根据需要实现以下两个虚函数:
1 | virtual void SetUp(); // 在TEST_F执行所有测试案例前运行 |
可以类比对象的构造函数和析构函数。这样,同一个TestFixtureName
下的每个TEST_F都会先执行SetUp,最后执行TearDwon。
此外,testing::Test还提供了两个static函数:
1 | static void SetUpTestCase(); // 在第一个TEST之前运行 |