为了促进测试重复使用,Fuchsia 测试套件组件应避免直接使用 RealmBuilder。而是应使用 FIDL 调用单独的测试 Realm 工厂组件 (TRF),该组件会创建测试 Realm 并返回 RealmProxy 连接。RealmProxy 连接可提供对 Realm 公开功能的访问权限。
这种模式可以更轻松地在 CTF 中重复使用测试,因为测试套件和测试 realm 工厂由 FIDL 接口分隔,这使得不同版本的测试套件可以针对同一测试 realm 工厂运行,反之亦然。未来,遵循此模式的测试还可用于不同类型的测试。
快速入门
如需更多帮助,请参阅下方的示例列表。
测试拓扑
测试应使用 FIDL 调用用于创建测试 Realm 的测试 Realm 工厂组件,而不是直接使用 RealmBuilder。Realm 工厂组件会返回一个 RealmProxy FIDL 连接,测试套件可以使用该连接连接到 Realm 公开的功能。根据惯例,RealmFactory FIDL 协议接受测试专用 RealmOptions
FIDL 表作为参数,以支持配置。
软件包结构
测试套件和测试 Realm 工厂必须属于不同的软件包。这样,您就可以在 CTF 中发布测试套件的软件包,而无需同时发布测试 Realm 工厂。在构建时,子软件包会将这两个组件合并到一个软件包中。
RealmFactory SDK 要求
如果 CTF 测试将使用 RealmFactory FIDL 协议,则该协议应具有 FIDL 可用性注解。该协议还必须添加到 compat_test
SDK 类别中,以指明该 API 可供 CTF 测试使用,并且必须保持向后兼容性,但不会向 SDK 用户公开,也不会向 partner
类别公开(如果该 API 应向 SDK 用户提供)。
常见测试模式
Puppet 组件
木偶是指在测试环境中运行并向测试套件公开 FIDL 协议的仅限测试组件。测试套件使用 RealmProxy 连接连接到该协议,并且傀儡会按照从测试套件发送的命令与 Realm 中的其他组件进行交互。
借助木偶,测试可以与测试王国交互,而无需公开王国的实现细节。例如,可使用傀儡向组件提供测试输入数据或检查其状态。
您可以编写支持单个测试的木偶,也可以编写可在不同测试领域中重复使用的通用组件。
如需查看木偶组件的示例,请参阅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 工厂组件的示例。
常见问题解答
我何时应将此模式应用于测试?
如果您的测试使用 RealmBuilder 运行和测试组件,则应改为将所有 RealmBuilder 代码封装在测试 Realm 工厂组件中。即使您不打算在 CTF 中运行测试,也必须采用此模式,以便利用 Fuchsia 团队的未来计划,使测试在不同情境(例如性能测试、系统 [非密封]测试和端到端测试)中更具可重用性。
如何模拟、虚构或桩我的组件的 FIDL 协议?
请参阅本部分关于模拟 FIDL 互动的内容。
已知问题
我的测试无法访问该领域中的非协议功能
RealmProxy 协议不提供对非协议功能的访问权限。不妨考虑创建傀儡来中介对非协议功能的访问。