新闻详情

新闻详情

首页 / 资讯中心 / 详情

如何用 SetUpTestSuite 和 TearDownTestSuite 在 GoogleTest 测试套件中共享一次性资源

发布时间:2026/9/12 9:14:39来源:尧图网络
如何用 SetUpTestSuite 和 TearDownTestSuite 在 GoogleTest 测试套件中共享一次性资源
如何用 SetUpTestSuite 和 TearDownTestSuite 在 GoogleTest 测试套件中共享一次性资源【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletestGoogleTest 会为测试套件中的每个测试单独创建一个 fixture 对象目的是让测试相互独立、便于调试。但当测试依赖的资源建立成本很高例如重量级连接、大型数据集时每个测试一份副本的开销就不值得了。advanced.md 的 Sharing Resources Between Tests in the Same Test Suite 一节给出的做法是在同一个测试套件test suite内只建立一份共享资源用SetUpTestSuite()在第一个测试前建立、TearDownTestSuite()在最后一个测试后拆除。前提是测试不修改该资源的状态只要满足这一点多个测试共享同一份资源副本是安全的。三步把一次性资源挂到测试套件上按 advanced.md 的说明操作分三步在测试 fixture 类假设叫FooTest中把用来持有共享资源的成员变量声明为static。在 fixture 类外部通常紧跟在类定义下方定义这些静态成员变量可以顺便给初始值。在同一个 fixture 类中定义static void SetUpTestSuite()来建立共享资源定义static void TearDownTestSuite()来释放它。文档特别提醒函数名的大小写是SetUpTestSuite不要拼成小写u的SetupTestSuite——faq.md 指出拼错之后这个函数会永远不会被调用而表面上看不出任何报错原因。完成这三步后GoogleTest 会自动处理调用时机SetUpTestSuite()在运行该套件第一个测试之前即创建第一个 fixture 对象之前被调用TearDownTestSuite()在运行最后一个测试之后即销毁最后一个 fixture 对象之后被调用。两个函数都可以省略按需定义。这一点与 reference/testing.md 中Test类的接口文档一致两者都是static方法分别执行该套件所有测试的共享 setup / teardown。完整示例代码以下是 advanced.md 给出的按套件共享资源的示例。其中T、new ...;以及...省略号是需要替换的部分把T换成你的资源类型new ...;换成实际的资源建立代码测试体中的省略号换成使用shared_resource_的实际断言。class FooTest : public testing::Test { protected: // Per-test-suite set-up. // Called before the first test in this test suite. // Can be omitted if not needed. static void SetUpTestSuite() { shared_resource_ new ...; // If shared_resource_ is **not deleted** in TearDownTestSuite(), // reallocation should be prevented because SetUpTestSuite() may be called // in subclasses of FooTest and lead to memory leak. // // if (shared_resource_ nullptr) { // shared_resource_ new ...; // } } // Per-test-suite tear-down. // Called after the last test in this test suite. // Can be omitted if not needed. static void TearDownTestSuite() { delete shared_resource_; shared_resource_ nullptr; } // You can define per-test set-up logic as usual. void SetUp() override { ... } // You can define per-test tear-down logic as usual. void TearDown() override { ... } // Some expensive resource shared by all tests. static T* shared_resource_; }; T* FooTest::shared_resource_ nullptr; TEST_F(FooTest, Test1) { ... you can refer to shared_resource_ here ... } TEST_F(FooTest, Test2) { ... you can refer to shared_resource_ here ... }注意示例中SetUpTestSuite()声明在protected区域但文档明确说明与TEST_P值参数化测试配合使用时SetUpTestSuite()和TearDownTestSuite()必须声明为public而不是protected见 advanced.md How to Write Value-Parameterized Tests 一节。如果你的 fixture 要用于参数化测试直接按public声明即可。必须遵守的约束与边界文档对共享资源模型给出了几条硬性限制写测试时要逐条对照测试顺序未定义。代码不能依赖某个测试先于或后于另一个测试运行共享资源的使用方式必须与执行顺序无关。不得污染共享状态。测试要么不修改任何共享资源的状态要么如果确实修改了必须在把控制权交回下一个测试之前把状态恢复到原值。SetUpTestSuite()可能不止被调用一次。当 fixture 类存在派生类时SetUpTestSuite()可能被多次调用因此不能假设函数体只执行一次。文档给出的对应处理是如果资源没有在TearDownTestSuite()中删除就应防止重复分配示例中注释掉的if (shared_resource_ nullptr)检查就是为此准备的。派生类仍能访问基类的静态共享资源。因此在管理共享资源时要小心确保资源在TearDownTestSuite()中被正确清理避免内存泄漏。在SetUpTestSuite()/TearDownTestSuite()中拿不到当前测试信息。advanced.md 说明current_test_info()在未运行测试时返回空指针而这两个函数执行的恰好不在某个测试的生命周期内。如果你需要按测试名做事这条路不可用套件名在这两个函数中是隐式已知的。如何验证套件级 setup 与 teardown 是否生效仓库自带的测试 googletest-setuptestsuite-test_.cc 演示了验证手段在SetUpTestSuite()或TearDownTestSuite()内放一条必然失败的断言例如class SetupFailTest : public ::testing::Test { protected: static void SetUpTestSuite() { ASSERT_STREQ(, SET_UP_FAIL); } }; TEST_F(SetupFailTest, NoopPassingTest) {} class TearDownFailTest : public ::testing::Test { protected: static void TearDownTestSuite() { ASSERT_STREQ(, TEAR_DOWN_FAIL); } }; TEST_F(TearDownFailTest, NoopPassingTest) {}配套脚本 googletest-setuptestsuite-test.py 对该可执行文件的判定方式是进程退出码非 0且输出中包含文档示例结果[ FAILED ] SetupFailTest: SetUpTestSuite or TearDownTestSuite [ FAILED ] TearDownFailTest: SetUpTestSuite or TearDownTestSuite 2 FAILED TEST SUITES这说明套件级函数中的断言失败会被整体归到测试套件上报告而不是某个具体测试googletest-output-test-golden-lin.txt 的 golden 输出里也有同样形态的示例行[ FAILED ] TestSuiteThatFailsToSetUp: SetUpTestSuite or TearDownTestSuite。反过来如果你想在资源不可用时直接跳过整个套件googletest-output-test_.cc 中有一个现成的用法在SetUpTestSuite()里调用GTEST_SKIP() Skip entire test suite;即可跳过整个测试套件。下一步资源已经在套件层面共享之后如果还需要跨多个测试套件乃至整个测试程序共享资源advanced.md 的 Global Set-Up and Tear-Down 一节提供了::testing::Environment与AddGlobalTestEnvironment()的更大粒度方案本文的套件级共享只覆盖单个测试套件内的场景。【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

C语言内存管理:原理、问题与优化实践 2026/9/12 9:50:44

C语言内存管理:原理、问题与优化实践

1. 为什么需要理解C语言内存管理在嵌入式开发中遇到过一个真实案例:某智能家居设备在运行72小时后必然死机。经过排查发现是开发者在处理传感器数据时,循环调用malloc()却忘记free(),导致内存泄漏最终耗尽系统资源。这个经历让我深刻意识到&a…

阅读更多 →
Repomix 隐私政策技术解读:CLI 本地处理、网站临时上传与浏览器扩展的最小权限设计 2026/9/12 9:50:44

Repomix 隐私政策技术解读:CLI 本地处理、网站临时上传与浏览器扩展的最小权限设计

Repomix 隐私政策技术解读:CLI 本地处理、网站临时上传与浏览器扩展的最小权限设计 【免费下载链接】repomix 📦 Repomix is a powerful tool that packs your entire repository into a single, AI-friendly file. Perfect for when you need to feed y…

阅读更多 →
学生装机指南:Intel Ultra 7 265K处理器与高性价比配置方案 2026/9/12 9:50:44

学生装机指南:Intel Ultra 7 265K处理器与高性价比配置方案

1. 为什么选择Intel Ultra 7 265K作为学生装机核心Intel Ultra 7 265K这颗处理器可以说是专为学生群体量身定制的全能型选手。我帮不少学弟学妹装过机,发现他们最常遇到的痛点就是:既要跑专业软件,又想打游戏,预算还特别紧张。265…

阅读更多 →
研发型与通用型项目管理系统的差异与选型指南 2026/9/12 9:50:43

研发型与通用型项目管理系统的差异与选型指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Beancount双重记账系统:从原理到实战应用 2026/9/12 9:50:43

Beancount双重记账系统:从原理到实战应用

1. Beancount:双重记账系统的核心价值第一次接触Beancount时,我被它简洁的文本记账方式所震撼。与传统的GUI记账软件不同,这个基于Python的命令行工具通过纯文本文件记录每笔交易,却能自动生成完整的财务报表。它的设计哲学让我想…

阅读更多 →
5 步跑通个人知识库助手:LLM Universe 大模型应用开发完整教程 2026/9/12 9:47:43

5 步跑通个人知识库助手:LLM Universe 大模型应用开发完整教程

5 步跑通个人知识库助手:LLM Universe 大模型应用开发完整教程 【免费下载链接】llm-universe 本项目是一个面向小白开发者的大模型应用开发教程,在线阅读地址:https://datawhalechina.github.io/llm-universe/ 项目地址: https://gitcode.…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞