C++怎么使用Google Test框架_C++ gtest单元测试框架使用教程

google Test是c++中流行的单元测试框架,支持断言、测试夹具和参数化测试。1. 可通过包管理器或CMake的FetchContent集成;2. 编写测试用例使用TEST宏和EXPECT_EQ等断言;3. CMake构建时链接GTest::gtest_main并启用测试;4. 断言分为EXPECT(继续执行)和ASSERT(终止)两类;5. 测试夹具TEST_F用于共享初始化逻辑;6. 参数化测试TEST_P结合INSTANTIATE_TEST_SUITE_P可对多组数据运行相同逻辑。推荐将测试独立存放并接入CI流程,确保测试快速且隔离。

C++怎么使用Google Test框架_C++ gtest单元测试框架使用教程

google Test(简称 gtest)是 C++ 中最流行的单元测试框架之一,由 Google 开发并开源。它支持丰富的断言、测试夹具(Test Fixtures)、参数化测试等功能,适合用于各种规模的 C++ 项目中进行单元测试。

1. 安装与配置 Google Test

在使用 gtest 前,需要先将其集成到你的项目中。常见方式有:通过包管理器安装或从源码编译。

ubuntu / debian 系统:

sudo apt-get install libgtest-dev cmake cd /usr/src/gtest sudo cmake . sudo make sudo cp *.a /usr/lib 

或者使用 vcpkg(推荐):

立即学习C++免费学习笔记(深入)”;

vcpkg install googletest 

也可以在项目中直接使用 CMake 添加:

include(FetchContent) FetchContent_Declare(   googletest   URL https://www.php.cn/link/5d810d095c3f16cce86a8b99060ff44c ) FetchContent_MakeAvailable(googletest) 

这样可以在项目中自动下载并链接 gtest,无需系统级安装。

2. 编写第一个测试用例

假设你有一个简单的加法函数需要测试:

// math.h #ifndef MATH_H #define MATH_H int add(int a, int b); #endif 
// math.cpp #include "math.h" int add(int a, int b) {     return a + b; } 

现在编写测试文件 test_math.cpp:

#include <gtest/gtest.h> #include "math.h" <p>// 测试用例:测试 add 函数 TEST(MathTest, AddFunction) { EXPECT_EQ(add(2, 3), 5); EXPECT_EQ(add(-1, 1), 0); EXPECT_EQ(add(0, 0), 0); }</p><p>// 主函数(如果 gtest 已经链接了 main,这里可以不写) int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } 

3. 使用 CMake 构建测试项目

创建 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.14) project(MyTestProject) <p>set(CMAKE_CXX_STANDARD 17)</p><h1>添加源文件和测试文件</h1><p>add_library(math_lib math.cpp)</p><h1>使用 FetchContent 获取 gtest</h1><p>include(FetchContent) FetchContent_Declare( googletest URL <a href="https://www.php.cn/link/5d810d095c3f16cce86a8b99060ff44c">https://www.php.cn/link/5d810d095c3f16cce86a8b99060ff44c</a> ) FetchContent_MakeAvailable(googletest)</p><h1>添加测试可执行文件</h1><p>enable_testing()</p>                     <div class="aritcle_card">                         <a class="aritcle_card_img" href="/ai/%E9%9D%92%E6%9F%9A%E9%9D%A2%E8%AF%95">                             <img src="https://img.php.cn/upload/ai_manual/001/246/273/68b6cab553c77389.png" alt="青柚面试">                         </a>                         <div class="aritcle_card_info">                             <a href="/ai/%E9%9D%92%E6%9F%9A%E9%9D%A2%E8%AF%95">青柚面试</a>                             <p>简单好用的日语面试辅助工具</p>                             <div class="">                                 <img src="/static/images/card_xiazai.png" alt="青柚面试">                                 <span>57</span>                             </div>                         </div>                         <a href="/ai/%E9%9D%92%E6%9F%9A%E9%9D%A2%E8%AF%95" class="aritcle_card_btn">                             <span>查看详情</span>                             <img src="/static/images/cardxiayige-3.png" alt="青柚面试">                         </a>                     </div>                 <p>add_executable(test_math test_math.cpp) target_link_libraries(test_math math_lib GTest::gtest_main)</p><h1>注册测试</h1><p>add_test(NAME MathTest ADD_COMMANDS test_math) 

构建流程:

mkdir build cd build cmake .. make ./test_math 

运行后你会看到类似输出:

[==========] Running 1 test from 1 test suite. [----------] Global test environment set-up. [----------] 1 test from MathTest [ RUN      ] MathTest.AddFunction [       OK ] MathTest.AddFunction (0 ms) [----------] 1 test from MathTest (0 ms total) [==========] 1 test from 1 test suite ran. (0 ms total) [  PASSED  ] 1 test. 

4. 常用断言介绍

gtest 提供两类断言:ASSERT 和 EXPECT。

  • ASSERT_*:失败时终止当前测试函数
  • EXPECT_*:失败时记录错误,继续执行后续语句

常见断言示例:

EXPECT_EQ(a, b);     // 相等 EXPECT_NE(a, b);     // 不相等 EXPECT_LT(a, b);     // 小于 EXPECT_LE(a, b);     // 小于等于 EXPECT_GT(a, b);     // 大于 EXPECT_GE(a, b);     // 大于等于 <p>EXPECT_TRUE(condition);   // 条件为真 EXPECT_FALSE(condition);  // 条件为假</p><p>EXPECT_STREQ(s1, s2);     // 字符串相等(C风格) EXPECT_STRNE(s1, s2);     // 字符串不等 EXPECT_THROW(stmt, ExceptionType);   // 是否抛出异常 EXPECT_NO_THROW(stmt);               // 是否不抛出异常 

5. 使用测试夹具(Test Fixtures)

当你需要多个测试共享相同数据或初始化逻辑时,可以使用 TEST_F。

class MyStringTest : public ::testing::Test { protected:     void SetUp() override {         str1 = "Hello";         str2 = "World";     } <pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">void TearDown() override {     // 清理资源(如有) }  std::string str1; std::string str2;

};

TEST_F(MyStringTest, Concatenate) { std::string result = str1 + ” ” + str2; EXPECT_EQ(result, “Hello World”); }

每个以 TEST_F 定义的测试都会创建一个新的 MyStringTest 实例,确保隔离性。

6. 参数化测试

如果你希望用不同输入运行同一测试逻辑,可以使用参数化测试。

class SquareTest : public ::testing::TestWithParam<int> {}; <p>TEST_P(SquareTest, PositiveNumbers) { int input = GetParam(); EXPECT_EQ(input * input, Square(input)); }</p><p>// 指定测试参数 INSTANTIATE_TEST_SUITE_P(Default, SquareTest, ::testing::Values(1, 2, 3, 4)); 

上述代码会为每个值生成一个独立测试用例。

基本上就这些。掌握以上内容后,你已经可以熟练在 C++ 项目中使用 Google Test 进行单元测试了。实际开发中建议将测试代码放在单独目录,并配合 CI 工具自动运行。不复杂但容易忽略的是保持测试独立性和快速执行。

上一篇
下一篇
text=ZqhQzanResources