介绍
Google Test(GTest)是 Google 开源的 C++ 单元测试框架,它提供了简单易用的断言、测试夹具(Fixtures)和测试运行机制,使 C++ 开发者能够编写高效的单元测试。
本博客将介绍如何在 macOS 上使用 CLion 配置 Google Test 进行 C++ 单元测试,包括安装 Google Test、配置 CMakeLists.txt、编写和运行测试代码,以及如何测试类和使用测试夹具。
1. 安装 Google Test
Google Test 在 macOS 上可以使用 Homebrew
安装:
brew install googletest
安装完成后,库文件通常会存放在 /usr/local/Cellar/googletest/
目录下(具体路径可通过 brew info googletest
查看)。
2. 创建 CLion 项目
- 打开 CLion,选择
New Project
。 - 选择
C++ Executable
,然后点击Create
创建一个项目。
3. 配置 CMakeLists.txt
方式 1:使用 Homebrew 安装的 Google Test
如果通过 brew install googletest
安装了 Google Test,可以这样配置 CMakeLists.txt:
cmake_minimum_required(VERSION 3.30)
project(MyGoogleTestProject)
set(CMAKE_CXX_STANDARD 20)
# 查找 Google Test
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
# 添加测试文件
add_executable(MyGoogleTestProject main.cpp)
# 链接 Google Test 库
target_link_libraries(MyGoogleTestProject GTest::GTest GTest::Main pthread)
# 启用测试
enable_testing()
add_test(NAME MyGoogleTestProject COMMAND MyGoogleTestProject)
方式 2:使用 Git 方式引入 Google Test
如果希望将 Google Test 作为项目的一部分,可以在 CMakeLists.txt
中手动拉取 Google Test:
cmake_minimum_required(VERSION 3.10)
project(MyGoogleTestProject)
set(CMAKE_CXX_STANDARD 17)
# 下载 Google Test(如果未安装)
include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/refs/heads/main.zip
)
FetchContent_MakeAvailable(googletest)
# 添加测试源码文件
add_executable(my_test test.cpp)
# 链接 Google Test
target_link_libraries(my_test gtest gtest_main)
# 启用测试
enable_testing()
4. 编写测试代码
在项目根目录下创建 main.cpp
文件,并编写测试代码,例如:
#include <gtest/gtest.h>
// 测试函数
int Add(int nA, int nB) {
return nA + nB;
}
// 测试用例
TEST(AddTest, HandlesPositiveNumbers) {
EXPECT_EQ(Add(2, 3), 5);
}
TEST(AddTest, HandlesNegativeNumbers) {
EXPECT_EQ(Add(-2, -3), -5);
}
// 主函数
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
如果需要测试类的成员函数如下:
- 创建 Calculator 类,该类提供加法和减法功能。
- 编写 Google Test 测试。
Calculator 类的头文件:
#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator {
public:
int Add(int nA, int nB);
int Subtract(int nA, int nB);
};
#endif // CALCULATOR_H
Calculator 类的源文件:
#include "Calculator.h"
int Calculator::Add(int nA, int nB) {
return nA + nB;
}
int Calculator::Subtract(int nA, int nB) {
return nA - nB;
}
为 Calculator 编写测试,创建 calculator_test.cpp 文件:
#include <gtest/gtest.h>
#include "Calculator.h"
// 测试 Add 方法
TEST(CalculatorTest, HandlesAddition) {
Calculator calculator;
EXPECT_EQ(calculator.Add(3, 4), 7);
EXPECT_EQ(calculator.Add(-2, -5), -7);
EXPECT_EQ(calculator.Add(10, -5), 5);
}
// 测试 Subtract 方法
TEST(CalculatorTest, HandlesSubtraction) {
Calculator calculator;
EXPECT_EQ(calculator.Subtract(10, 3), 7);
EXPECT_EQ(calculator.Subtract(5, 8), -3);
EXPECT_EQ(calculator.Subtract(-5, -10), 5);
}
测试类的成员函数的结果:
5. 运行 Google Test
方法 1:手动运行
在 CLion 终端中执行:
cmake --build .
./MyGoogleTestProject
你应该会看到 Google Test 的输出结果。
方法 2:CLion 直接运行
-
在 CLion 运行
-
使用 Google Test 配置
- 点击 CLion 顶部菜单 “Run” > “Edit Configurations…”
- 点击 “+” 号,选择 Google Test
- 选择
Target
,然后应用并运行
-
查看测试结果
在 CLion 底部的 “Test Runner” 窗口,你可以看到测试是否通过。
6. 添加更多测试
如果你有多个测试文件,比如 math_test.cpp
和 string_test.cpp
,可以这样修改 CMakeLists.txt
:
add_executable(math_test math_test.cpp)
add_executable(string_test string_test.cpp)
target_link_libraries(math_test GTest::GTest GTest::Main)
target_link_libraries(string_test GTest::GTest GTest::Main)
add_test(NAME MathTest COMMAND math_test)
add_test(NAME StringTest COMMAND string_test)
然后在终端运行:
ctest
这样可以一次性运行所有测试。
7. 处理 Google Test 断言
Google Test 断言分为 ASSERT_ 和 EXPECT_:
EXPECT_EQ(a, b)
: 继续运行,报告错误ASSERT_EQ(a, b)
: 立即终止当前测试
例如:
TEST(SampleTest, Example) {
ASSERT_EQ(1, 1); // 通过
EXPECT_EQ(1, 2); // 失败,但继续执行
ASSERT_EQ(1, 2); // 失败,测试终止
}
8. 使用 Google Test Fixtures
Google Test 提供 Fixture(测试夹具),用于在多个测试用例间共享资源:
class MyTestFixture : public ::testing::Test {
protected:
void SetUp() override { nValue = 5; } // 每个测试前执行
void TearDown() override { } // 每个测试后执行
int nValue;
};
TEST_F(MyTestFixture, TestAddition) {
EXPECT_EQ(nValue + 5, 10);
}
总结
- 安装 Google Test (
brew install googletest
或 CMakeFetchContent
) - 配置 CMakeLists.txt
- 编写 Google Test 代码
- 运行 Google Test
- 在 CLion 进行 Google Test 配置
- 使用 CTest 运行所有测试
- 使用断言
EXPECT_
/ASSERT_
- 使用 Test Fixture 进行高级测试
这样,你就能在 macOS + CLion 环境下使用 Google Test 进行 C++ 单元测试了!🚀