comprehensive-rust 课程中的 Chromium Rust 测试方案:rust_gtest_interop 库深度解析

发布时间:2026/11/7 12:39:01

comprehensive-rust 课程中的 Chromium Rust 测试方案:rust_gtest_interop 库深度解析 comprehensive-rust 课程中的 Chromium Rust 测试方案rust_gtest_interop 库深度解析【免费下载链接】comprehensive-rustThis is the Rust course used by the Android team at Google. It provides you the material to quickly teach Rust.项目地址: https://gitcode.com/GitHub_Trending/co/comprehensive-rust本篇技术指南聚焦 Google 开源 Rust 课程comprehensive-rustChromium 专题中的 rust-gtest-interop.md 文档系统讲解 Chromium 中如何借助rust_gtest_interop库用 Rust 编写gtest测试用例。文章将带你掌握#[gtest(...)]属性宏、expect_eq!断言族的用法并结合仓库内配套的 testing.md、build-gn.md 与 chromium-import-macro.md 文档理解 Chromium 对 Rust 代码的三种测试策略、GN 构建规则及 crate 导入机制最终具备在 Chromium 工程中编写、构建和运行 Rustgtest测试的完整实战能力。背景Chromium 与 Rust 社区在测试组织方式上的差异Rust 社区惯例与源码同文件的单元测试模块Rust 社区通常把单元测试写在与被测代码相同的源文件内的mod tests模块中如课程 testing.md 前文所讲的那样#[cfg(test)] mod tests { #[test] fn my_test() { todo!() } }Chromium 惯例测试与被测代码分离Chromium 中单元测试习惯上放在独立的源文件中Rust 代码也延续了这一实践。这样做的两个好处见 testing.md测试可发现性一致测试位置统一、可预期便于在庞大代码库中定位避免二次编译独立文件避免了.rs文件在test配置下被重复编译。Chromium 中测试 Rust 代码的三种策略课程文档 testing.md 明确给出了 Chromium 中测试 Rust 代码的三种可选方案方案说明适用场景原生 Rust 测试#[test]Rust 社区标准方式在//third_party/rust之外不推荐使用C 编写的gtest测试通过 FFI 调用 Rust 函数Rust 代码只是薄薄的 FFI 胶水层已有单元测试覆盖足够Rust 编写的gtest测试通过被测 crate 的公开 API 测试必要时使用pub mod for_testing { ... }需要为 Rust 实现编写独立测试这正是本专题接下来几页的主题文档中还给出了两条重要的决策参考第三方 crate 的原生 Rust 测试最终应当由 Chromium 的 CI 机器人执行——不过这种需求很少出现通常只在新增或更新第三方 crate 时才有实际案例QR 功能在 Chromium 自研 Rust 层几乎没有逻辑只是薄薄的 FFI 粘合代码因此沿用现有 C 单元测试通过ScopedFeatureList参数化测试来开关 Rust 实现而假设中的 PNG 集成方案若需要libpng有而pngcrate 缺失的内存安全像素变换如 RGBA→BGRA、gamma 校正则更适合用 Rust 编写独立测试。rust_gtest_interop库核心能力rust-gtest-interop.md 指出rust_gtest_interop库源码位于 Chromium 的//testing/rust_gtest_interop/提供两类核心能力把 Rust 函数当作gtest测试用例通过#[gtest(...)]属性宏实现使用expect_eq!等断言宏用法类似assert_eq!但断言失败时不会 panic、也不会终止测试。最小示例use rust_gtest_interop::prelude::*; #[gtest(MyRustTestSuite, MyAdditionTest)] fn test_addition() { expect_eq!(2 2, 4); }逐行拆解这个示例use rust_gtest_interop::prelude::*;引入库的 prelude其中导出#[gtest]属性宏与expect_eq!等断言宏#[gtest(MyRustTestSuite, MyAdditionTest)]第一个参数是测试套件test suite名第二个参数是测试用例名。编译后该 Rust 函数会被注册为 Cgtest框架中的一个测试用例在gtest的测试过滤、sharding、输出报告中以MyRustTestSuite.MyAdditionTest形式出现expect_eq!(2 2, 4)非 panic 断言失败时记录失败信息并继续执行当前测试函数区别于assert_eq!的立即中止语义。与assert_eq!的语义差异不 panic、不终止测试课程文档强调expect_eq!是 similar toassert_eq!but not panicking and not terminating the test when the assertion fails。这一设计在gtest生态中意义重大gtest的惯例是单个测试函数内可以有多条断言断言失败只标记该测试为失败而不中断后续断言的执行从而在一次测试运行中尽可能多地暴露问题原生 Rust 的assert_eq!失败即 panic 中止若测试函数内有多处断言只能看到第一处失败因此expect_eq!一族宏expect_eq!及similar macros即expect_ne!、expect_true!/expect_false!等同类非终止断言让 Rust 测试的行为与 Cgtest测试保持一致。用 GN 把 Rust gtest 测试接入构建方式一并入已有 C 测试二进制最简单的方式是把 Rust 测试文件直接加入一个已包含 C 测试的现有testtarget见 build-gn.mdtest(ui_base_unittests) { ... sources [ my_rust_lib_unittest.rs ] deps [ :my_rust_lib ] }方式二独立的 Rust 测试 static_library把 Rust 测试单独放到一个rust_static_library中同样可行但需要手动声明对支持库的依赖rust_static_library(my_rust_lib_unittests) { testonly true is_gtest_unittests true crate_root my_rust_lib_unittest.rs sources [ my_rust_lib_unittest.rs ] deps [ :my_rust_lib, //testing/rust_gtest_interop, ] } test(ui_base_unittests) { ... deps [ :my_rust_lib_unittests ] }关键点说明testonly true标记该库仅用于测试is_gtest_unittests true告诉构建系统这是一个gtest单元测试库使rust_gtest_interop的注册代码正确接入gtest框架deps中显式加入//testing/rust_gtest_interop支持库这正是本篇文章主题库的 GN target最终仍需某个testtarget 把该rust_static_library链接进测试二进制。用chromium::import!宏导入被测 crate测试文件通常需要引用被测 crate 的公开 API。由于 Chromium 中的rust_static_library默认不显式指定crate_name其 crate 名由完整 target 路径和名称推导而来直接书写往往冗长难用。chromium-import-macro.md 给出了解决方案——使用自动导入的chromiumcrate 中的chromium::import!宏chromium::import! { //ui/base:my_rust_lib; } use my_rust_lib::my_function_under_test;该宏在底层展开后大致等价于extern crate ui_sbase_cmy_urust_ulib as my_rust_lib; use my_rust_lib::my_function_under_test;展开示例中经过字符变换的 crate 名只是示意用于说明为什么直接书写推导出的 crate 名很不方便。为什么建议用 import! 而不是显式 crate_name文档指出rust_static_library支持通过crate_name属性指定显式名称但这种做法不被推荐因为 crate 名必须全局唯一。crates.io 天然保证 crate 名唯一因此由gnrt工具课程 cargo.md 中有讲解生成的cargo_crateGN target 可以使用简短 crate 名而 Chromium 自研 target 则统一走chromium::import!宏避免手工维护易冲突的全局唯一名称。完整实战组合一个可运行的测试流程综合上述内容在 Chromium 中为一个 Rust 库编写gtest测试的完整链路为准备环境按 setup.md 完成 Chromium 构建配置要求代码较新commit position 1223636 之后即 2023 年 11 月之后推荐 component/debug 构建以加快迭代gn gen out/Debug autoninja -C out/Debug chrome编写被测库创建my_rust_librust_static_library导出待测函数编写测试文件my_rust_lib_unittest.rsuse rust_gtest_interop::prelude::*; chromium::import! { //ui/base:my_rust_lib; } use my_rust_lib::my_function_under_test; #[gtest(MyRustLibTestSuite, MyFunctionWorks)] fn test_my_function() { expect_eq!(my_function_under_test(), 42); }接入构建按上文方式一或方式二修改 GN 文件方式二记得在deps中加入//testing/rust_gtest_interop构建并运行测试autoninja -C out/Debug ui_base_unittests随后直接运行该测试二进制Rust 测试即以gtest用例形式被发现和执行。与 Chromium 测试生态的衔接总结rust_gtest_interop是 Chromium 中 Rust 代码也要遵守 Chromium 测试惯例 这一设计理念的关键落地组件测试文件独立于源码与其他 C 测试一样通过 GN target 组织Rust 测试注册进统一的gtest框架与 C 测试共享测试发现、过滤、结果报告等基础设施expect_eq!等非终止断言让 Rust 侧行为对齐 Cgtest的断言语义配合chromium::import!宏可以干净地跨 target 引用被测 crate而无需处理全局唯一 crate 名的负担。如果你正在 Chromium 中开发 Rust 功能且需要为 Rust 实现本身编写覆盖测试那么以 rust-gtest-interop.md 为起点结合 build-gn.md 的构建规则与 chromium-import-macro.md 的导入机制即可快速搭建起一套符合 Chromium 工程惯例的 Rust 测试体系。【免费下载链接】comprehensive-rustThis is the Rust course used by the Android team at Google. It provides you the material to quickly teach Rust.项目地址: https://gitcode.com/GitHub_Trending/co/comprehensive-rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/6 7:55:38

单片机计算机毕设之基于 STM32 或 51 单片机的仓储环境火灾预警智能控制系统设计 基于 STM32 或 51 单片机的液晶显示型多维度安防监测系统设计(023807)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/11/6 11:05:26

100G FPGA UDP协议栈自研与上板测试实战

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

2026/11/6 14:06:31

单片机计算机毕设之基于 STM32 的 ADXL345 跌倒识别运动监测系统设计 基于 STM32 的 MAX30102 人体血氧心率检测装置设计(023707)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/11/7 12:34:17

东莞常平电工证补办别怕学历不高,电子证书也能轻松拿

东莞常平电工证补办别怕学历不高,电子证书也能轻松拿 学历不高怕报不上名?东莞常平电工证补办其实没那么难,电子证书已经成为主流,只要流程走对,资料准备齐全,完全不用担心。今天就通过一个真实案例,带大家了解电工证补办的全过程,包括证书变更、注销…

2026/11/7 12:34:17

东莞常平电工证补办怎么操作?上岗必备流程全解析

东莞常平电工证补办怎么操作?上岗必备流程全解析 工地太忙根本没时间复习考试,东莞常平的电工证补办成了不少工友的心头事。特别是对于在建筑、电力、安装等行业打拼的电工来说, 上岗必备…

2026/11/7 12:34:17

象州考电工证2026河南最新政策怎么应对证书过期问题

象州考电工证2026河南最新政策怎么应对证书过期问题 证书过期了不知道怎么复审延期?这事儿真不是小事,尤其是2026河南最新政策出台后,很多电工持证人都懵了。你不是一个人在战斗,很多人都在为电工证复审头疼。别慌,这篇文章就是为你准备的,教你…

2026/11/7 12:34:17

广州电工证考试合格怎么准备?2026河南最新政策有啥变化

广州电工证考试合格怎么准备?2026河南最新政策有啥变化 实操考试心里没底怕挂科?广州电工证考试合格是不少从业者关心的话题,尤其是2026年河南最新政策出台后,考试流程、内容和资格审核都有了新的变化。很多人担心新规会增加考试难度,但只要掌握…

2026/11/7 12:34:16

黄山电工证报名有效期多久?考前押题帮你轻松应对复审

黄山电工证报名有效期多久?考前押题帮你轻松应对复审 证书过期了不知道怎么复审延期?你不是一个人,这是很多电工从业者都遇到过的头疼问题。黄山电工证报名虽然看似简单,但一旦证书有效期过了,很多人却不知道怎么操作,甚至因此耽误了工作机会。特别是现…

2026/11/7 12:29:16

济阳电工证报名不复习怎么过?考前押题救你忙中抽闲

济阳电工证报名不复习怎么过?考前押题救你忙中抽闲 工地太忙根本没时间复习考试,尤其是像我们这些一线工人,天天在工地上跑,哪还有心思去背那些理论知识?但偏偏电工证是必须的, 济阳电工证报名 不是你想考就能考的, 考前押题…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/6 10:49:01

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/7 0:03:08

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科 实操考试心里没底怕挂科?你不是一个人。特别是在郑州这样的城市,很多施工企业负责人和一线作业人员在报考电工证和钳工证时都面临着同样的困惑。到底该考哪个证?哪个更适合自己?哪个证书…

2026/11/7 0:03:08

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱?

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱? 之前考的证在外省能不能转过来?这个问题我遇到太多了,今天就拿广西电工证办理流程来具体说说,别再走弯路了。广西电工证的报考、复审、继续教育这些环节,如果你不了解,真的会吃大亏,尤其对于从…

2026/11/7 0:03:08

电气电工证都有哪些保姆级教程

电气电工证都有哪些保姆级教程 你是不是正愁不知道去哪报名,怕被中介坑?别急,这篇保姆级教程专为河南初次报考人员准备,帮你搞清楚 电气电工证都有哪些 ,以及如何避开那些坑。 电气电工证都有哪些?别被五花八门的证书搞懵了…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/6 10:49:01

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑