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); 两个字符串的内容不同,忽略大小写