测试 Realm Factory

为了促进测试重复使用,Fuchsia 测试套件组件应避免直接使用 RealmBuilder。而是应使用 FIDL 调用单独的测试 Realm 工厂组件 (TRF),该组件会创建测试 Realm 并返回 RealmProxy 连接。RealmProxy 连接可提供对 Realm 公开功能的访问权限。

这种模式可以更轻松地在 CTF 中重复使用测试,因为测试套件和测试 realm 工厂由 FIDL 接口分隔,这使得不同版本的测试套件可以针对同一测试 realm 工厂运行,反之亦然。未来,遵循此模式的测试还可用于不同类型的测试

快速入门

  • 如需编写新测试,请运行 testgen 以生成测试样板代码。
  • 如需重构现有测试,请运行 testgen 并将旧测试代码复制到生成的测试中。

如需更多帮助,请参阅下方的示例列表。

测试拓扑

测试应使用 FIDL 调用用于创建测试 Realm 的测试 Realm 工厂组件,而不是直接使用 RealmBuilder。Realm 工厂组件会返回一个 RealmProxy FIDL 连接,测试套件可以使用该连接连接到 Realm 公开的功能。根据惯例,RealmFactory FIDL 协议接受测试专用 RealmOptions FIDL 表作为参数,以支持配置。

trf_topology.png

软件包结构

测试套件和测试 Realm 工厂必须属于不同的软件包。这样,您就可以在 CTF 中发布测试套件的软件包,而无需同时发布测试 Realm 工厂。在构建时,子软件包会将这两个组件合并到一个软件包中。

trf_ctf_packages.png

RealmFactory SDK 要求

如果 CTF 测试将使用 RealmFactory FIDL 协议,则该协议应具有 FIDL 可用性注解。该协议还必须添加到 compat_test SDK 类别中,以指明该 API 可供 CTF 测试使用,并且必须保持向后兼容性,但不会向 SDK 用户公开,也不会向 partner 类别公开(如果该 API 应向 SDK 用户提供)。

常见测试模式

Puppet 组件

木偶是指在测试环境中运行并向测试套件公开 FIDL 协议的仅限测试组件。测试套件使用 RealmProxy 连接连接到该协议,并且傀儡会按照从测试套件发送的命令与 Realm 中的其他组件进行交互。

trf_toplogy_with_puppet.png

借助木偶,测试可以与测试王国交互,而无需公开王国的实现细节。例如,可使用傀儡向组件提供测试输入数据或检查其状态。

您可以编写支持单个测试的木偶,也可以编写可在不同测试领域中重复使用的通用组件。

如需查看木偶组件的示例,请参阅Archivist 测试木偶,该木偶会向 Archivist 发出日志并检查数据,并由此 FIDL 协议控制。任何测试都可以使用 Archivist 测试木偶将任意日志和 Inspect 数据注入测试 realm。

注入测试数据

某些测试会向被测组件提供输入数据,例如结构化配置值或从目录读取的数据。使用测试 Realm 工厂组件时,至少有两种方法可以向组件提供输入数据:

  • 使用 RealmOptions FIDL 表的某个字段将 FIDL 调用中的数据传递给 RealmFactory/CreateRealm
  • 创建一个傀儡来提供数据。

第一种方法是最简单的,通常在必须在组件开始运行之前提供测试数据时需要使用这种方法,但贡献者应注意避免使用此方法导致漏洞抽象。例如:如果组件从 /config/data 目录 capability 读取输入数据,请考虑从测试套件传递数据(作为 VMO),并让测试 realm 提供此目录,而不是将句柄传递给 fuchsia.io.Directory capability。

模拟 FIDL 互动

借助 RealmBuilder,您可以定义“本地组件”来桩模拟 FIDL 协议或记录 FIDL 流量。不过,使用 TRF 时,测试套件和测试 Realm 会在不同的进程中运行。不过,不妨考虑创建一个傀儡组件,以便测试套件可以使用该组件向被测组件发送桩请求或响应。

示例

以下是一些测试套件和测试 Realm 工厂组件的示例。

测试套件 Realm 工厂组件
WLAN hw-sim 测试 WLAN hw-sim 测试 realm 工厂
诊断检测测试 诊断检测到测试 Realm 工厂
诊断采样器测试 诊断采样器测试 Realm 工厂
pkgdir 测试 pkgdir test realm factory
CTF 示例 Rust 测试 CTF 示例测试 Realm 工厂
CTF 示例 C++ 测试 CTF 示例测试 Realm 工厂
模拟 hwinfo 测试 realm 工厂

常见问题解答

我何时应将此模式应用于测试?

如果您的测试使用 RealmBuilder 运行和测试组件,则应改为将所有 RealmBuilder 代码封装在测试 Realm 工厂组件中。即使您不打算在 CTF 中运行测试,也必须采用此模式,以便利用 Fuchsia 团队的未来计划,使测试在不同情境(例如性能测试、系统 [非密封]测试和端到端测试)中更具可重用性。

如何模拟、虚构或桩我的组件的 FIDL 协议?

请参阅本部分关于模拟 FIDL 互动的内容。

已知问题

我的测试无法访问该领域中的非协议功能

RealmProxy 协议不提供对非协议功能的访问权限。不妨考虑创建傀儡来中介对非协议功能的访问。