Google Test 介绍和使用指南
文章目录
- Google Test 介绍和使用指南
- 主要特性
- 安装 Google Test
- 使用包管理器安装(Linux)
- 使用 CMake 集成
- 基本使用
- 简单测试示例
- 常用断言宏
- 测试夹具(Test Fixtures)
- 参数化测试
- 死亡测试
- 高级特性
- 类型化测试
- 值参数化测试
- 运行测试
- 与 CMake 集成示例
- 最佳实践
Google Test 介绍和使用指南
Google Test(通常缩写为 gtest)是 Google 开发的一个 C++ 测试框架,用于编写和运行单元测试。它是目前最流行的 C++ 测试框架之一,具有丰富的功能和良好的跨平台支持。
主要特性
- 丰富的断言:提供多种断言宏用于验证测试结果
- 测试夹具:支持测试夹具(Test Fixtures)来共享测试设置和清理代码
- 参数化测试:支持参数化测试,可以用不同的参数运行相同的测试逻辑
- 死亡测试:可以测试程序是否按预期方式终止
- 跨平台:支持 Linux、Windows、Mac 等多种平台
- 与构建系统集成:易于与 CMake、Bazel 等构建系统集成
安装 Google Test
使用包管理器安装(Linux)
# Ubuntu/Debian
sudo apt-get install libgtest-dev# 编译并安装
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
sudo cp *.a /usr/lib
使用 CMake 集成
现代 CMake 项目可以通过 FetchContent
直接引入 Google Test:
include(FetchContent)
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/refs/heads/main.zip
)
FetchContent_MakeAvailable(googletest)
基本使用
简单测试示例
#include <gtest/gtest.h>// 测试函数
int Add(int a, int b) {return a + b;
}// 定义一个测试用例
TEST(TestAdd, PositiveNumbers) {EXPECT_EQ(Add(2, 3), 5);
}TEST(TestAdd, NegativeNumbers) {EXPECT_EQ(Add(-2, -3), -5);
}int main(int argc, char **argv) {testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
常用断言宏
Google Test 提供两类主要断言:
- ASSERT_ 系列:失败时立即终止当前测试
- EXPECT_ 系列:失败时继续执行当前测试
常用断言:
EXPECT_EQ(val1, val2)
:验证相等EXPECT_NE(val1, val2)
:验证不等EXPECT_TRUE(condition)
:验证条件为真EXPECT_FALSE(condition)
:验证条件为假EXPECT_LT(val1, val2)
:验证 val1 < val2EXPECT_LE(val1, val2)
:验证 val1 <= val2EXPECT_GT(val1, val2)
:验证 val1 > val2EXPECT_GE(val1, val2)
:验证 val1 >= val2EXPECT_STREQ(str1, str2)
:验证字符串相等EXPECT_THROW(statement, exception_type)
:验证抛出特定异常
测试夹具(Test Fixtures)
测试夹具允许你在多个测试间共享设置和清理代码:
class VectorTest : public testing::Test {
protected:void SetUp() override {v1.push_back(1);v2.push_back(2);v2.push_back(3);}void TearDown() override {// 清理代码}std::vector<int> v1;std::vector<int> v2;
};TEST_F(VectorTest, SizeTest) {EXPECT_EQ(v1.size(), 1);EXPECT_EQ(v2.size(), 2);
}TEST_F(VectorTest, ContentTest) {EXPECT_EQ(v1[0], 1);EXPECT_EQ(v2[0], 2);EXPECT_EQ(v2[1], 3);
}
参数化测试
class IsPrimeTest : public testing::TestWithParam<int> {// 可以在这里定义夹具
};TEST_P(IsPrimeTest, TestsIsPrime) {int n = GetParam();EXPECT_TRUE(IsPrime(n));
}INSTANTIATE_TEST_SUITE_P(PrimeValues, IsPrimeTest,testing::Values(2, 3, 5, 7, 11, 13, 17, 19));
死亡测试
验证代码是否按预期终止:
TEST(ExitTest, DiesCorrectly) {EXPECT_DEATH({fprintf(stderr, "Fatal error detected!\n");exit(1);}, "Fatal error detected!");
}
高级特性
类型化测试
template <typename T>
class TypedTest : public testing::Test {};typedef testing::Types<int, float, double> MyTypes;
TYPED_TEST_SUITE(TypedTest, MyTypes);TYPED_TEST(TypedTest, SizeTest) {EXPECT_EQ(sizeof(TypeParam), 4); // 对int和float成立,double不成立
}
值参数化测试
class MyTest : public testing::TestWithParam<std::tuple<int, int>> {};TEST_P(MyTest, SumTest) {auto params = GetParam();int a = std::get<0>(params);int b = std::get<1>(params);EXPECT_EQ(a + b, Add(a, b));
}INSTANTIATE_TEST_SUITE_P(Default, MyTest,testing::Combine(testing::Range(1, 5),testing::Range(5, 10)));
运行测试
编译后运行测试程序,Google Test 会输出详细的测试结果:
[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from TestAdd
[ RUN ] TestAdd.PositiveNumbers
[ OK ] TestAdd.PositiveNumbers (0 ms)
[ RUN ] TestAdd.NegativeNumbers
[ OK ] TestAdd.NegativeNumbers (0 ms)
[----------] 2 tests from TestAdd (0 ms total)[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (0 ms total)
[ PASSED ] 2 tests.
与 CMake 集成示例
完整 CMake 项目示例:
cmake_minimum_required(VERSION 3.14)
project(MyProject)# 引入Google Test
include(FetchContent)
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/refs/heads/main.zip
)
FetchContent_MakeAvailable(googletest)# 添加可执行文件
add_executable(my_teststest/test_main.cpptest/test_example.cppsrc/my_code.cpp
)# 链接Google Test
target_link_libraries(my_testsGTest::GTestGTest::Main
)# 添加测试
enable_testing()
add_test(NAME my_tests COMMAND my_tests)
最佳实践
- 测试命名应清晰表达其目的
- 每个测试应只验证一件事
- 使用夹具避免重复代码
- 优先使用 EXPECT_ 而非 ASSERT_,除非失败后继续测试无意义
- 为测试添加必要的注释
- 保持测试独立,不依赖执行顺序
- 定期运行测试,最好集成到CI/CD流程中
Google Test 提供了丰富的文档和示例,可以通过其 GitHub 仓库 获取更多信息。