1. GTest 下载安装(Linux)
git clone --recursive https://github.com/google/googletest.git cd googletest/ mkdir bulid cmake .. cmake-gui .. make -j4 sudo make install
1.2 GTest测试
cd googletest/ mkdir InstallTest cd InstallTest/ touch main.cpp g++ -std=c++11 main.cpp -lgtest -lpthread ls ./a.out
main.cpp 内容
#include <gtest/gtest.h> int Add(int a, int b) { return a + b; } TEST(FooTest, HandleNoneZeroInput) { EXPECT_EQ(7, Add(4, 3)); EXPECT_EQ(18, Add(0, 18)); } int main(int argc, char *argv[]) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
1.3 GMock 安装(Linux)
GMock已经集成进GTest了,编译GTest时默认就编译GMock。
2. GTest基本使用
2.1 GTest基本概念
Test Case 测试用例,验证一个函数测试是否成功。包括创建测试环境、进行测试、销毁测试环境。
Test Suite 测试套件,一个功能可能有若干个测试用例,这些测试用例合起来叫做一个测试套件。
Test Fixtures 测试治具,多个测试用例建测试环境和销毁测试环境相同。则建立一个测试治具,把相同配置适用于多个测试用例。
测试用例和测试名称
做UT(单元测试)时,我们把类\函数分为若干个测试用例,每个测试用例下边有若干个测试,每个测试有一个测试名称。
打个比方,我有一个系统备份还原的控制类。下边有两个函数需要测试:备份和还原。我对这个类单元测试时这样命名:
测试用例名称 BackupManagerTest
测试名称1 BackupTest 备份测试(模块接口测试)
测试名称2 RecoveryTest 备份测试(模块接口测试)
测试名称3 UnZIPTest 解压压缩测试(模块局部数据结构测试)
测试名称4 RecoveryAlreadyBackupTest 已备份还原测试(模块中所有独立执行通路测试)
测试名称5 RecoveryNoBackupTest 未备份还原测试(模块的各条错误处理通路测试)
断言
对于每一个测试用例,我们需要对其行为做出断言。为真则通过测试,为假则测试失败。
2.2 GTest 断言
GTest提供了两个系列的断言宏ASSERT_ 和 EXPECT_。无论安那种断言,只要失败就意味着测试失败。
- ASSERT_ 致命断言,如果失败则跳出当前测试,进行下一个测试
- EXPECT_ 非致命断言,如果失败仅打印当前失败,接着本测试
- 关于bool值断言
致命断言 | 非致命断言 | 验证 |
---|---|---|
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | condition 是真的 |
ASSERT_FALSE(condition); | EXPECT_FALSE(condition); | condition 是假的 |
- 关于数值型数据检查
致命断言 | 非致命断言 | 验证 |
---|---|---|
ASSERT_EQ(val1, val2); | EXPECT_EQ(val1, val2); | val1 == val2 |
ASSERT_NE(val1, val2); | EXPECT_NE(val1, val2); | val1 != 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 |
- 关于字符串比较
致命断言 | 非致命断言 | 验证 |
---|---|---|
ASSERT_STREQ(str1,str2); | EXPECT_STREQ(str1,str2); | 这两个字符串具有相同的内容 |
ASSERT_STRNE(str1,str2); | EXPECT_STRNE(str1,str2); | 两个字符串的内容不同 |
ASSERT_STRCASEEQ(str1,str2); | EXPECT_STRCASEEQ(str1,str2); | 两个字符串的内容相同,忽略大小写 |
ASSERT_STRCASENE(str1,str2); | EXPECT_STRCASENE(str1,str2); | 两个字符串的内容不同,忽略大小写 |