测试 Realm Factory

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

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

快速入门

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

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

测试拓扑

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

trf_topology.png

软件包结构

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

trf_ctf_packages.png

RealmFactory SDK 要求

如果 CTF 测试将使用 RealmFactory FIDL 协议,则应包含 FIDL 可用性注解。还必须将该协议添加到 partner_internal SDK 类别,以表明该 API 可供 CTF 测试使用,并且必须保持向后兼容性,但不得向 SDK 用户或 partner 类别(如果应可供 SDK 用户使用)公开该协议。

常见的测试模式

Puppet 组件

Puppet 是一种仅供测试使用的组件,它在测试领域运行,会向测试套件提供 FIDL 协议。测试套件使用 RealmProxy 连接连接到协议,Puppet 通过从测试套件发送的命令与领域中的其他组件进行交互。

trf_toplogy_with_puppet.png

Puppet 可让测试与测试领域进行交互,而无需公开大区的实现细节。例如,木偶可用于为组件提供测试输入数据或检查其状态。

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

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

注入测试数据

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

  • 使用 RealmOptions FIDL 表的某个字段在 RealmFactory/CreateRealm 的 FIDL 调用中传递数据。
  • 创建 puppet 来提供数据。

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

模拟 FIDL 交互

RealmBuilder 可将“本地组件”定义为对 FIDL 协议进行存根或记录 FIDL 流量。不过,如果使用 TRF,测试套件和测试领域会在不同的进程中运行。您可以考虑改为创建一个 puppet 组件,供测试套件用来向被测组件发送桩请求或响应。

示例

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

测试套件 Realm 工厂组件
WLAN hw-sim 测试 WLAN hw-sim 测试领域工厂
诊断检测测试 诊断信息、检测测试领域工厂
诊断采样器测试 诊断采样器测试领域工厂
pkgdir 测试 pkgdir 测试领域工厂
CTF 示例 Rust 测试 CTF 示例测试领域工厂
CTF 示例 C++ 测试 CTF 示例测试领域工厂
模拟 hwinfo 测试领域工厂

常见问题解答

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

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

如何模拟、伪造组件的 FIDL 协议或对其进行存根?

请参阅模拟 FIDL 交互的这一部分。

已知问题

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

RealmProxy 协议不提供对非协议功能的访问权限。 考虑创建 puppet 来调解对非协议功能的访问。