为了促进测试重复使用,Fuchsia 测试套件组件应避免直接使用 RealmBuilder。相反,测试应使用 FIDL 调用单独的测试领域工厂组件 (TRF),该组件会创建测试领域并返回 RealmProxy 连接。RealmProxy 连接可提供对 Realm 公开功能的访问权限。
这种模式可让您更轻松地在 CTF 中重复使用测试,因为测试套件和测试领域工厂由 FIDL 接口分隔,从而使不同版本的测试套件可以针对同一测试领域工厂运行,反之亦然。遵循此模式的测试将来也可以重复用于不同类型的测试。
快速入门
如需更多帮助,请参阅下面的示例列表。
测试拓扑
测试应使用 FIDL 调用用于创建测试领域的测试领域工厂组件,而不是直接使用 RealmBuilder,而不是直接使用 RealmBuilder。Realm 工厂组件会返回一个 RealmProxy FIDL 连接,测试套件可以使用该连接连接到 Realm 提供的公开功能。按照惯例,RealmFactory FIDL 协议接受测试专用 RealmOptions
FIDL 表作为参数,以支持配置。
软件包结构
测试套件和测试领域工厂必须属于单独的软件包。这样,就可以在 CTF 中发布测试套件的软件包,而无需同时发布测试领域工厂。在构建时,子打包会将两个组件组合到一个软件包中。
RealmFactory SDK 要求
如果 CTF 测试将使用 RealmFactory FIDL 协议,则应包含 FIDL 可用性注解。还必须将该协议添加到 partner_internal
SDK 类别,以表明该 API 可供 CTF 测试使用,并且必须保持向后兼容性,但不得向 SDK 用户或 partner
类别(如果应可供 SDK 用户使用)公开该协议。
常见的测试模式
Puppet 组件
Puppet 是一种仅供测试使用的组件,它在测试领域运行,会向测试套件提供 FIDL 协议。测试套件使用 RealmProxy 连接连接到协议,Puppet 通过从测试套件发送的命令与领域中的其他组件进行交互。
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 来调解对非协议功能的访问。