尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Flutter Engine Fuchsia 单元测试本地运行指南:从环境配置到参数实战

Flutter Engine Fuchsia 单元测试本地运行指南:从环境配置到参数实战 跨平台图形学前端【免费下载链接】engineThe Flutter engine项目地址https://gitcode.com/gh_mirrors/eng/engine点击查看免费下载本文以 Flutter Engine 仓库中的 Fuchsia 平台单元测试说明 为核心骨架结合 run_unit_tests.sh 的完整实现细节系统讲解如何在本地运行 Fuchsia 平台相关的 Flutter Engine 单元测试。读完本文你将掌握$FUCHSIA_DIR与$ENGINE_DIR环境变量的正确配置方式、Fuchsia 包服务器的启动流程以及run_unit_tests.sh全部命令行参数--unopt、--count、--package-filter、--gtest-filter的用法并理解测试包从构建、发布到执行的完整链路。一、前置条件两个环境变量运行 Fuchsia 单元测试的前提是拥有两个独立的代码仓库检出并分别用环境变量指向它们$FUCHSIA_DIR指向你的 Fuchsia 源码检出目录fuchsia.git checkout。$ENGINE_DIR指向 Flutter Engine 检出的src/目录。以 zsh 为例可将以下两行加入~/.zprofilebash 用户对应加入~/.bashrc或~/.profileexport FUCHSIA_DIR~/fuchsia export ENGINE_DIR~/engine/src注意$ENGINE_DIR必须是src/目录而不是仓库根目录。这是因为 devshell 脚本内部通过FLUTTER_ENGINE_SRC_DIR定位 engine 根目录并据此推导 Fuchsia SDK 的位置。从 vars.sh 的实现可以看到Linux 下 SDK 位于${FLUTTER_ENGINE_SRC_DIR}/fuchsia/sdk/linuxmacOS 下位于${FLUTTER_ENGINE_SRC_DIR}/fuchsia/sdk/mac其余操作系统会直接报错 We only support linux/mac 并退出。这两个环境变量不仅在测试脚本中必需也是 branch_from_fuchsia.sh、build_and_copy_to_fuchsia.sh 等整套 Fuchsia devshell 工具的共同依赖。环境自检run_unit_tests.sh运行时会自动调用 vars.sh 中的三个检查函数缺少任何一个依赖都会立即报错退出检查函数检查内容失败时的提示ensure_fuchsia_dir$FUCHSIA_DIR是否已设置要求提供有效的 fuchsia.git checkoutensure_engine_dir$ENGINE_DIR是否已设置要求设置为 Engine 检出的src/目录ensure_ninjaninja是否在$PATH中提示安装 depot_tools 并将其加入$PATH其中ninja通过 depot_tools 提供这是 Flutter Engine 构建的标配工具链。如果你的环境中尚未安装 depot_tools请先按 Engine 开发环境文档Setting-up-the-Engine-development-environment.md完成工具链准备再继续后续步骤。二、第一步启动 Fuchsia 包服务器在开始测试前需要在一个独立的终端中启动 Fuchsia 的包服务器package server让测试运行器能够从本地仓库拉取测试包cd $FUCHSIA_DIR fx servefx serve是 Fuchsia 开发环境的统一服务入口它会持续在后台提供软件包解析、分发等服务。这一步必不可少的原因在于测试运行时ffx test需要从设备/模拟器上按软件包 URLfuchsia-pkg://fuchsia.com/...解析并下载被测包。如果跳过此步骤测试会因包无法解析而失败——脚本中甚至专门给出了该场景的错误提示Launch(InstanceCannotResolve)详见下文常见问题一节。三、第二步运行单元测试脚本包服务器就绪后在另一个终端执行$ENGINE_DIR/flutter/tools/fuchsia/devshell/run_unit_tests.sh在当前 Engine 仓库中该脚本的对应路径为 tools/fuchsia/devshell/run_unit_tests.sh仓库根目录即$ENGINE_DIR的src/之下的内容。若你的检出布局是 Flutter 官方推荐的engine/src上述$ENGINE_DIR/flutter/...写法依然成立。脚本默认以debug 配置运行测试runtime_modedebug、compilation_modejit、fuchsia_cpux64。它会在$ENGINE_DIR下构建out/fuchsia_debug_x64输出目录。脚本内部完整工作流程从 run_unit_tests.sh 源码看一次测试运行实际经历以下五个阶段生成构建配置并构建测试目标第 63-71 行脚本自动调用flutter/tools/gn生成 GN 配置参数为--fuchsia --no-lto --fuchsia-cpux64 --runtime-modedebug [--unoptimized]随后执行ninja -C out/fuchsia_debug[_unopt]_x64 fuchsia_tests构建测试目标。注册调试符号第 73-77 行通过ffx debug symbol-index add将输出目录中的.build-id注册到符号索引方便后续对测试崩溃或断言失败进行符号化回溯。注意ffx必须在$FUCHSIA_DIR目录下执行。收集测试包第 79 行用find在输出目录中按package_filter默认*tests-0.far查找所有.far测试包。发布测试包第 81-94 行逐个将测试包通过ffx repository publish发布到 Fuchsia 仓库amber-files目录并将包名去掉-0.far后缀记录到test_names数组。运行测试第 96-115 行回到$FUCHSIA_DIR对每个测试包执行ffx test run fuchsia-pkg://fuchsia.com/test_name#meta/test_name.cm [--count N] [-- --gtest_filterfilter]测试目标的定义位置脚本构建的fuchsia_tests目标定义在仓库根目录的 BUILD.gn 中仅当满足is_fuchsia enable_unittests时才会生成if (is_fuchsia enable_unittests) { group(fuchsia_tests) { testonly true deps [ //flutter/shell/platform/fuchsia:tests ] } }即所有 Fuchsia 平台测试最终汇聚到//flutter/shell/platform/fuchsia:tests覆盖 dart runner、flutter runner、runtime 等子模块的测试套件对应 shell/platform/fuchsia 目录下的tests目标。四、命令行参数详解run_unit_tests.sh支持四类参数全部对应到脚本第 34-61 行的参数解析逻辑。值得注意的一点是短横线与下划线两种写法均被接受例如--package-filter与--package_filter等价便于在不同 shell 习惯之间切换。--unopt或--unoptimized关闭 C 编译器优化$ENGINE_DIR/flutter/tools/fuchsia/devshell/run_unit_tests.sh --unopt关闭优化后栈回溯、断点定位和调试器交互会更可靠代价是构建与运行速度下降。脚本内部会将此参数透传给gn并将输出目录后缀改为_unopt即out/fuchsia_debug_unopt_x64构建命令相应变为ninja -C out/fuchsia_debug_unopt_x64 fuchsia_tests。--count N重复运行 N 次用于复现偶发失败$ENGINE_DIR/flutter/tools/fuchsia/devshell/run_unit_tests.sh --count 5脚本会将--count N原样拼接为ffx test run的--count参数用于测试 flake偶发失败连续运行 N 次观察某条用例是否稳定通过。默认值为 1 次。--package-filter只运行指定测试包默认情况下脚本会运行所有匹配*tests-0.far的测试包。若只想运行某个特定包例如 flow 测试$ENGINE_DIR/flutter/tools/fuchsia/devshell/run_unit_tests.sh --package-filter flow_tests-0.far该参数会传给find命令作为文件名匹配模式因此可以传任意 glob 表达式。参数名中的-0是 Fuchsia 测试包的标准后缀约定代表该包的第一个第零个归档版本。--gtest-filter只运行包内特定测试配合--package-filter可以精确定位到具体测试用例。例如只运行 flutter runner 测试包中所有名字含FlatlandConnection的用例$ENGINE_DIR/flutter/tools/fuchsia/devshell/run_unit_tests.sh --package-filter flutter_runner_tests-0.far --gtest-filter *FlatlandConnection*脚本将其转换为ffx test run ... -- --gtest_filter*FlatlandConnection*第 51-54 行其中--用于分隔组件参数与程序参数。该过滤语法遵循 GoogleTest 通配规则*匹配任意字符序列?匹配单个字符-前缀表示排除。这里的示例并非虚构FlatlandConnection是 Flutter 在 Fuchsia 上管理 Flatland 场景图连接的实现类见 flatland_connection.h其单元测试位于 flatland_connection_unittests.cc使用gtest/gtest.h编写并借助fakes/scenic/fake_flatland.h模拟 Scenic 侧的行为来验证 VSync 等待、present 等逻辑。运行上述过滤命令即可只执行这些用例。参数总表参数短横线 / 下划线作用默认值底层实现--unopt/--unoptimized关闭 C 编译器优化开启优化透传gn输出目录加_unopt后缀--count N每个测试包重复运行 N 次1透传ffx test run --count N--package-filter glob只运行文件名匹配的测试包*tests-0.far传给find匹配.far文件--gtest-filter pattern只运行包内匹配的 gtest 用例全部拼接为-- --gtest_filterpattern除上述参数外脚本不接受任何未知参数否则会打印Unknown argument: $1并退出第 56-59 行。五、完整实战示例下面演示一个典型的最小到完整的测试流程。场景 A全量跑一遍所有 Fuchsia 平台单元测试debug 模式# 终端 1启动包服务器 cd $FUCHSIA_DIR fx serve # 终端 2运行测试 $ENGINE_DIR/flutter/tools/fuchsia/devshell/run_unit_tests.sh场景 B针对 flatland 连接逻辑做 flake 检查无优化 重复 5 次 单包单用例$ENGINE_DIR/flutter/tools/fuchsia/devshell/run_unit_tests.sh \ --unopt \ --count 5 \ --package-filter flutter_runner_tests-0.far \ --gtest-filter *FlatlandConnection*场景 C仅验证 flow 测试包$ENGINE_DIR/flutter/tools/fuchsia/devshell/run_unit_tests.sh --package-filter flow_tests-0.far值得一提的是tools/fuchsia/devshell/test/test_run_unit_tests.sh 本身就是一个用脚本测试脚本的示例它会依次以--package-filter flutter_runner_tests-0.far、--count 2、--gtest-filter *FlatlandConnection*以及无参数四种方式调用run_unit_tests.sh仅校验脚本能成功运行而不断言测试结果可作为本地验证 devshell 工具链是否完好的快速手段。六、常见问题与排错1.Launch(InstanceCannotResolve)错误脚本在第 101 行明确给出了提示if this fails because of Launch(InstanceCannotResolve), run fx serve and try again。该错误意味着测试包无法从包服务器解析几乎总是因为漏掉了第一步的fx serve或包服务器意外退出。重新启动fx serve后再运行即可。2.txt_tests被自动跳过脚本在第 104-109 行内置了一个特殊逻辑当测试包名为txt_tests时直接跳过并打印警告原因是脚本尚不知道如何过滤掉其中必然失败的ParagraphTest.*用例。如果你需要运行文本排版相关测试需要手动构造过滤条件绕过这一限制例如指定更精确的--package-filter并配合--gtest-filter。3. 找不到ninjaensure_ninja检查失败时提示 depot_tools 未安装或未加入$PATH。depot_tools 同时提供gn、ninja、autoninja等工具是 Flutter Engine 构建链的基础依赖配置方式参见 Setting-up-the-Engine-development-environment.md。4. 输出目录名称理解输出目录命名规则有助于排查构建问题默认 debug 模式下为out/fuchsia_debug_x64加--unopt后变为out/fuchsia_debug_unopt_x64。测试包.far文件就位于这些目录中可用find out/fuchsia_debug_x64 -name *tests-0.far手动确认构建产物是否齐全。七、总结在本地运行 Flutter Engine 的 Fuchsia 单元测试本质上是一条GN 配置生成 → ninja 构建 → 符号注册 → 包发布 → ffx 执行的流水线而 run_unit_tests.sh 将整个过程封装为一条命令。掌握--unopt、--count、--package-filter、--gtest-filter四个参数即可灵活控制测试范围、调试体验与重复次数。无论你是要为 Fuchsia 平台贡献新的引擎功能还是排查 Flatland、flow 等模块的回归问题这套流程都是最快在本机复现与验证的手段。赞分享跨平台图形学前端【免费下载链接】engineThe Flutter engine项目地址https://gitcode.com/gh_mirrors/eng/engine点击查看免费下载相关推荐Flutter 在 Fuchsia 上的 Runner 集成测试本地运行、命令行参数与迭代实战指南Flutter 在 Fuchsia 上的 Runner 集成测试本地运行、命令行参数与迭代实战指南 Flutter 引擎在 Fuchsia 平台上的 runt跨平台移动开发前端UI组件桌面应用Flutter Engine Scenario App iOS 测试指南从本地运行到 Golden 图像校验Flutter Engine Scenario App iOS 测试指南从本地运行到 Golden 图像校验 本文以 testing/scenario_app跨平台图形学前端TVM 测试指南Python 单元测试的 Target 参数化、本地运行与 CI 集成实战TVM 测试指南Python 单元测试的 Target 参数化、本地运行与 CI 集成实战 导读 本篇指南围绕 Apache TVMOpen Machine模型编译深度学习推理引擎上一篇MelGAN高效、轻量级的语音合成神器下一篇Obamify安全最佳实践确保你的图像处理过程安全可靠创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表