ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

3 分钟上手 GoogleTest:C++ 单元测试与 Mock 完整指南

3 分钟上手 GoogleTest:C++ 单元测试与 Mock 完整指南 3 分钟上手 GoogleTestC 单元测试与 Mock 完整指南【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletestGoogleTest 是 Google 开源的 C 测试框架一次搞定两件事单元测试用断言验证你的函数行为和模拟测试用 GoogleMock 造出假对象隔离依赖。适合刚接手 C 项目、需要给代码加测试的同学。它同时支持 Linux、macOS 和 Windows一套测试代码三端跑通。 30 秒跑通先看到PASS再学原理这条命令让你先尝到甜头——直接拿仓库里自带的示例跑一遍。首先克隆仓库git clone https://gitcode.com/GitHub_Trending/go/googletest接着进入目录用 CMake 配置并构建仓库默认会连 gmock 一起构建见 CMakeLists.txt 里的BUILD_GMOCK选项mkdir -p googletest/build cd googletest/build cmake .. -Dgtest_build_testsON cmake --build . -j4最后运行它自己的一个测试套件ctest -R googletest_unittest --output-on-failure看到一堆[ PASSED ]就说明环境没问题。如果你不想跑框架自测下一步直接写自己的测试更快。 拆开看GoogleTest 的 3 个核心零件这一节把框架拆成用例、断言、生命周期三块看完你就懂任何一个测试文件长什么样。1. 测试用例用 TEST 宏定义每个测试就一行TEST(套件名, 用例名)加一段逻辑。用例名要能说明测什么下面是仓库示例 sample1_unittest.cc 的简化版#include gtest/gtest.h #include sample1.h TEST(FactorialTest, Negative) { EXPECT_EQ(1, Factorial(-5)); // 负数阶乘定义为 1 }2. 断言EXPECT 还是 ASSERTEXPECT_*失败后记录并继续跑一次运行能暴露多个 bugASSERT_*失败后立即终止当前用例适合后面代码依赖这个前提的场景。常用宏就记三个EXPECT_EQ相等失败会打印两边的值、EXPECT_TRUE、EXPECT_DEATH验证程序按预期方式崩溃见 断言参考。3. main() 不用你写链接GTest::gtest_main库就自带main()它会调RUN_ALL_TESTS()跑光所有用例并返回退出码0 全过1 有失败。想要自己的main()改链GTest::gtest再手动调InitGoogleTest(argc, argv)即可。小结TEST定用例、EXPECT做判断、gtest_main负责执行三者拼起来就是一个能跑的测试程序。 换个场景用CMake 集成 平台差异真实项目里你不会make整个仓库而是把 GoogleTest 作为依赖拉进自己的工程。场景一用 FetchContent 拉取依赖推荐这段 CMake 在你自己的项目根目录写效果是构建时自动下载 GoogleTest 源码并一起编译cmake_minimum_required(VERSION 3.16) project(my_project CXX) set(CMAKE_CXX_STANDARD 17) # GoogleTest 至少要求 C17 include(FetchContent) FetchContent_Declare( googletest URL https://gitcode.com/GitHub_Trending/go/googletest ) FetchContent_MakeAvailable(googletest) enable_testing() add_executable(hello_test hello_test.cc) target_link_libraries(hello_test GTest::gtest_main) include(GoogleTest) gtest_discover_tests(hello_test) # 让 ctest 逐个发现用例最后两行是关键gtest_discover_tests让ctest能按用例名过滤比如ctest -R FactorialTest只跑这一个套件。场景二Windows 上的两个坑位CRT 冲突主项目用动态运行时、GoogleTest 默认静态时会出现MSVC runtime library mismatch。在FetchContent_MakeAvailable之前加一行if(WIN32) set(gtest_force_shared_crt ON CACHE BOOL FORCE) endif()宽字符参数MSVC 下命令行参数是宽字符串InitGoogleTest有对应重载链接gtest_main时不用操心自己写main时注意选wchar_t**版本。场景三想 Mock 依赖链接 gmock 即可GoogleMock 在同一个仓库里googlemock/。把链接库换成GTest::gmock_main就能声明 Mock 类#include gmock/gmock.h class FakeClock : public Clock { public: MOCK_METHOD(time_t, Now, (), override); }; TEST(MetricTest, UsesClock) { FakeClock clock; EXPECT_CALL(clock, Now()).WillOnce(Return(100)); // 被测代码里拿到的时间被你接管了 }用法细节看 Mock 指南更完整的教程在 Mock Cookbook。 踩坑速查高频报错怎么解现象链接时报undefined reference to gtest 相关符号。原因只链了gtest没链gtest_main或 C 标准低于 17。解法确认target_link_libraries(... GTest::gtest_main)且CMAKE_CXX_STANDARD设为 17。现象Windows 下LNK2038: MSVC runtime library mismatch。原因主工程与 GoogleTest 的 CRT 模式不一致。解法配置时加gtest_force_shared_crt ON见上一节。现象断言失败但看不到实际值。原因用了EXPECT_TRUE(a b)它不打印两边。解法换成EXPECT_EQ(a, b)失败时会输出期望值和实际值。现象某个测试单独跑过、全量跑失败。原因用例之间有共享状态违反了独立性原则。解法把状态放进SetUp()/TearDown()fixture每个用例重建对象调试用--gtest_filter套件名.用例名单独复现。现象--gtest_death_test_style报 no fork 或超时。原因死亡测试要 fork 子进程某些受限环境容器、CI 沙箱不允许。解法改用--gtest_death_test_stylethreadsafe或在该环境跳过死亡测试。 下一步去哪看更多入门教程Primer —— 10 分钟讲完写测试的套路断言全表assertions.mdMock 全表mocking.mdCMake 官方快速上手quickstart-cmake.mdBazel 用户看 quickstart-bazel.md现成例子googletest/samples/从sample1到sample10由浅入深进阶技巧fixture、参数化测试、TypedTestadvanced.md核心源码入口googletest/include/gtest/gtest.h、googletest/src/gtest.cc从sample1_unittest.cc抄一个用例改成你自己的函数就是最快的学习方式。【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表