单元测试框架:Google Test的实战应用‌

Google Test 简介

Google Test(简称 gtest)是由 Google 开发的 C++ 单元测试框架,支持自动化测试、断言机制和测试夹具。其核心功能包括参数化测试、死亡测试(检查程序崩溃行为)以及与构建工具(如 CMake)的集成。m.kchydz8888.comAAA

安装与配置

Linux/macOS

通过包管理器安装(如 Ubuntu):m.dhyzsb.cnAAA

sudo apt-get install libgtest-dev

手动编译并安装:m.rotrasat.comAAA

cd /usr/src/gtest  
sudo cmake .  
sudo make  
sudo cp *.a /usr/lib  


Windows

  1. 下载源码:GitHub - google/googletest
  2. 使用 CMake 生成 Visual Studio 项目并编译。m.bofeng2007.comAAA
  3. 将生成的库文件(如 gtest.lib)和头文件路径添加到项目中。m.yzzdhsb.comAAA

基本测试用例编写

创建一个测试文件 example_test.cppm.zzjlzb.comAAA

#include <gtest/gtest.h>

// 测试函数示例
int Add(int a, int b) { return a + b; }

// 定义测试用例
TEST(TestSuiteName, TestName) {
    EXPECT_EQ(Add(2, 3), 5);  // 断言
}

int main(int argc, char **argv) {
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

关键宏说明m.xwjxkj.comAAA

  • TEST(TestSuiteName, TestName):定义一个测试用例。m.primefx.cnAAA
  • EXPECT_EQ/ASSERT_EQ:验证条件是否成立(ASSERT_* 失败会终止当前测试)。m.chjkdq.comAAA

高级功能应用

测试夹具(Fixture)m.cqmcjc.comAAA

复用初始化逻辑:m.fmyyj.cnAAA

class MyFixture : public ::testing::Test {
protected:
    void SetUp() override { /* 初始化代码 */ }
    void TearDown() override { /* 清理代码 */ }
};

TEST_F(MyFixture, Test1) {
    // 使用夹具成员变量或方法
}

参数化测试m.botaisam.comAAA

通过 TEST_P 实现多参数测试:m.bigocc.comAAA

class ParamTest : public ::testing::TestWithParam<int> {};

TEST_P(ParamTest, HandleInput) {
    int value = GetParam();
    EXPECT_GT(value, 0);  // 验证参数大于0
}

INSTANTIATE_TEST_SUITE_P(Default, ParamTest, ::testing::Values(1, 2, 3));

死亡测试m.xyjinglong.comAAA

验证程序崩溃行为:m.gzlesier.comAAA

TEST(DeathTest, ExitAssertion) {
    ASSERT_DEATH({
        fprintf(stderr, "Crash!");
        exit(1);
    }, "Crash!");
}

集成与运行

CMake 集成示例m.semanbio.comAAA

CMakeLists.txt 中添加:m.woshicnc.comAAA

find_package(GTest REQUIRED)
add_executable(MyTests example_test.cpp)
target_link_libraries(MyTests GTest::GTest GTest::Main)

运行测试telidz.comAAA

编译后执行生成的可执行文件:spulszone.comAAA

./MyTests  # 输出测试结果

常见问题解决

  1. 链接错误:确保编译时链接 pthread(Linux)或正确配置库路径(Windows)。bjlyps.comAAA
  2. 断言失败:使用 EXPECT_NEAR 处理浮点数比较误差。yhzhengxing.comAAA
  3. 测试隔离:通过夹具的 SetUp/TearDown 避免状态污染。changdefood.cnAAA

通过以上步骤,可快速将 Google Test 应用于 C++ 项目,覆盖单元测试需求。hsljt168.comAAA

全部评论

相关推荐

11-20 20:09
门头沟学院 UE5
秋招正式结束,终于拿到满意的offer了,还是自己想干的游戏客户端开发,算是入了游戏行业的行(不过我还是坚定的劝退游戏行业),也算是给自己四年里玩了三年的大学生活一个交代。回想一下大学生涯,刚进大学的时候因为学历问题想选择了考研,所以大一大二基本是纯玩过去的,结果大二暑假了解到了国内研究生的牛马现状,害怕自己到时候不是跳了就是跟导师爆了,又选了就业这条路。大二暑假到大三说是开始学技术了,其实也没怎么好好学,还是在边学边玩的状态,到了大三下找暑假实习的时候,项目项目不行,八股八股不会,所以暑假实习根本没敢投简历。说起来好笑,我开始认真学技术的转折应该是大三下开始看地下偶像,有一个北京的团来郑州远征,认识了两个很好的偶像,萌生了想要去北京工作,这样周周都能看地下偶像的想法。这样一直学到了七月中旬,开始在boss上投简历。结果因为我学的是ue,小厂基本没有,大厂又不敢投,即使之前有一点unity的经验也不熟,导致约面很少,即使约面了也过不了。运气很好的是,有一家武汉的小厂在我不会unity的情况下也收留了我,虽然在这家实习的经历不怎么愉快,干的也是纯dirty&nbsp;work,但公司的氛围还不错,也给了我带薪学习,熟悉项目背八股的机会。我想说的是实习真的很重要,有了实习约面的机会就大很多,我也在实习一段时间后开始继续投简历,也有了一些中大厂的约面,虽然基本还是一面挂,但总之还是在不断面试不断复盘中学到很多,也有一些很好的面试官在面试中会引导和讲解,虽然也有一些很烂的面试官。转折大概在这个月初吧,在这之前我一直都是备战春招了,面试最远的走到了hr面之后的横向,最后横向挂了,然后收到了现在这家公司的面试,当时根本没想着面试能通过,抱着试一试的心态,结果问的东西基本都会,流程很快,稀里糊涂的两轮技术面一轮hr面都过了,从约面到发offer只用了三周。回想自己这一路,也是有些戏剧性。当初那个让我学技术卷出来的动力,就是想去北京,想周周都能见到想见的小偶像。结果现在拿到offer了,去的是上海;支撑我走过来的两位小偶像,一个已经毕业了,一个下个月也要毕业了。就这样吧,下个月去北京看她的毕业sp,然后去上海实习提前感受一下,希望能顺利吧。
WhythZ:恭喜bb,恭喜小偶像
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务