一、安装方法
1、Linux
sudo apt update
sudo apt install libgtest-dev
sudo apt install cmake g++ # 编译工具
#libgtest-dev需要手动编译:
cd /usr/src/gtest
sudo cmake .
sudo make
sudo cp lib/*.a /usr/lib
Cmake工程调用:
find_package(GTest REQUIRED)
target_link_libraries(my_test PRIVATE GTest::GTest GTest::Main pthread)
2、MacOS
brew install googletest
CMake工程调用
find_package(GTest REQUIRED)
target_link_libraries(my_test PRIVATE GTest::GTest GTest::Main)
3、Windows
- 推荐vcpkg方式(Powershell)
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg install gtest
把vcpkg路径加到CMake:
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/vcpkg/scripts/buildsystems/vcpkg.cmake ..
- 自己编译源码
去 GoogleTest GitHub 下载
用 CMake 打开并生成 Visual Studio 工程
编译安装
二、GTest的基本用法
假设你有个函数:
int add(int a, int b) {
return a + b;
}
写一个测试文件:
#include <gtest/gtest.h>
TEST(AddTest, HandlesPositiveNumbers) {
EXPECT_EQ(add(2, 3), 5); // 期望结果为 5
}
TEST(AddTest, HandlesNegativeNumbers) {
EXPECT_EQ(add(-1, -1), -2);
}
CmakeLists.txt示例
cmake_minimum_required(VERSION 3.14)
project(MyTest)
enable_testing()
find_package(GTest REQUIRED)
add_executable(my_test test_add.cpp)
target_link_libraries(my_test PRIVATE GTest::GTest GTest::Main pthread)
add_test(NAME MyTest COMMAND my_test)
编译&运行(用IDE工具也可以)
mkdir build && cd build
cmake ..
make
ctest # 或 ./my_test
运行结果:
[ RUN ] AddTest.HandlesPositiveNumbers
[ OK ] AddTest.HandlesPositiveNumbers
[ RUN ] AddTest.HandlesNegativeNumbers
[ OK ] AddTest.HandlesNegativeNumbers
[==========] 2 tests from 1 test case ran.
三、常用TEST宏(写测试用例)和断言(写检查点)
1、TEST宏最基本写法
TEST(TestCaseName, TestName) {
// 测试内容
}
//TestCaseName:一组相关测试的名字(逻辑上相当于“类名”)。
//TestName:具体的测试用例名字。
2、断言(检查点)
GTest 提供了很多断言,可以简单分为几类:
1. 相等/不等
• EXPECT_EQ(val1, val2) —— 判断相等
• EXPECT_NE(val1, val2) —— 判断不相等
• EXPECT_LT(val1, val2) —— 小于
• EXPECT_LE(val1, val2) —— 小于等于
• EXPECT_GT(val1, val2) —— 大于
• EXPECT_GE(val1, val2) —— 大于等于
2. 布尔检查
• EXPECT_TRUE(expr)
• EXPECT_FALSE(expr)
3. 字符串比较
• EXPECT_STREQ(str1, str2) —— C 风格字符串相等
• EXPECT_STRNE(str1, str2) —— 不相等
• EXPECT_STRCASEEQ(str1, str2) —— 忽略大小写相等
• EXPECT_STRCASENE(str1, str2) —— 忽略大小写不相等
4. 浮点数比较
浮点数不能用 EXPECT_EQ,要用:
• EXPECT_FLOAT_EQ(val1, val2) —— float 精确比较
• EXPECT_DOUBLE_EQ(val1, val2) —— double 精确比较
• EXPECT_NEAR(val1, val2, abs_error) —— 允许误差范围
5. 异常检查
• EXPECT_THROW(statement, ExceptionType) —— 期待抛出某异常
• EXPECT_ANY_THROW(statement) —— 期待抛出任何异常
• EXPECT_NO_THROW(statement) —— 期待不抛出异常
3、EXPECT_* vs ASSERT_*
• EXPECT:失败后继续执行后面的代码。
• ASSERT:失败就立刻中止当前测试函数。
TEST(Demo, AssertVsExpect) {
EXPECT_EQ(1, 2); // 失败,但继续往下走
ASSERT_EQ(1, 2); // 失败,直接停止该测试
EXPECT_TRUE(true); // 永远不会执行到这里
}
四、常见组合
1. EXPECT_EQ / ASSERT_EQ —— 最常用
2. EXPECT_TRUE / ASSERT_TRUE
3. EXPECT_NEAR —— 浮点数比较
4. EXPECT_THROW —— 异常检查
五、GTest断言速查表
类别 | EXPECT_* 宏 | ASSERT_* 宏 | 说明 |
相等/不等 | EXPECT_EQ(val1, val2) | ASSERT_EQ(val1, val2) | 判断相等 |
EXPECT_NE(val1, val2) | ASSERT_NE(val1, val2) | 判断不相等 | |
EXPECT_LT(val1, val2) | ASSERT_LT(val1, val2) | 小于 | |
EXPECT_LE(val1, val2) | ASSERT_LE(val1, val2) | 小于等于 | |
EXPECT_GT(val1, val2) | ASSERT_GT(val1, val2) | 大于 | |
EXPECT_GE(val1, val2) | ASSERT_GE(val1, val2) | 大于等于 | |
布尔 | EXPECT_TRUE(expr) | ASSERT_TRUE(expr) | 断言表达式为真 |
EXPECT_FALSE(expr) | ASSERT_FALSE(expr) | 断言表达式为假 | |
字符串 (C 风格) | EXPECT_STREQ(str1, str2) | ASSERT_STREQ(str1, str2) | 相等 |
EXPECT_STRNE(str1, str2) | ASSERT_STRNE(str1, str2) | 不相等 | |
EXPECT_STRCASEEQ(str1, str2) | ASSERT_STRCASEEQ(str1, str2) | 忽略大小写相等 | |
EXPECT_STRCASENE(str1, str2) | ASSERT_STRCASENE(str1, str2) | 忽略大小写不相等 | |
浮点数 | EXPECT_FLOAT_EQ(val1, val2) | ASSERT_FLOAT_EQ(val1, val2) | float 精确比较 |
EXPECT_DOUBLE_EQ(val1, val2) | ASSERT_DOUBLE_EQ(val1, val2) | double 精确比较 | |
EXPECT_NEAR(val1, val2, tol) | ASSERT_NEAR(val1, val2, tol) | 允许误差范围 | |
异常 | EXPECT_THROW(stmt, ExType) | ASSERT_THROW(stmt, ExType) | 抛出指定异常 |
EXPECT_ANY_THROW(stmt) | ASSERT_ANY_THROW(stmt) | 抛出任意异常 | |
EXPECT_NO_THROW(stmt) | ASSERT_NO_THROW(stmt) | 不抛异常 |