为 CTF 进行测试

本指南介绍了如何添加移除 CTF 测试。

如何向 CTF 添加测试

在开始之前,请先阅读 CTF 测试要求。最值得注意的要求是,测试必须先使用测试领域工厂,然后才能遵循本指南。

如果某项测试位于 //sdk/ctf/tests:tests 的组中,则会包含在 CTF 中。 在将测试添加到该组之前,必须重写其构建规则,使其使用 CTF 版本。很遗憾,这是一个必不可少的步骤,我们很快就会取消这一步骤。

如需向该组添加测试,请在包含测试的 fuchsia_test_component 目标的 BUILD.gn 文件中执行以下各个步骤。

1. 导入 CTF build 规则

import("//sdk/ctf/build/ctf.gni")

2. 使用 CTF GN 模板

将测试的 fuchsia_package 声明替换为 ctf_fuchsia_package

之前

fuchsia_package("fuchsia-example-tests") {
  testonly = true
  package_name = "fuchsia-example-tests"
  deps = [ ":fuchsia-example-test-component" ]
}

之后

ctf_fuchsia_package("fuchsia-example-tests") {
  testonly = true
  package_name = "fuchsia-example-tests"
  deps = [ ":fuchsia-example-test-component" ]
}

3. 将测试发布归档添加到 build 图

ctf_fuchsia_package 会生成一个 ${target_name}_archive 目标,该目标可生成测试的 FAR 归档文件。此归档内容是在 CTF 中发布的内容。将 group("tests") 目标添加到 BUILD.gn 文件(如果该文件不存在),然后将归档添加为依赖项:

group("tests") {
  testonly = true
  deps = [
    ":fuchsia-example-tests_archive",
    ...
  ]
}

您已成功将 group("tests") 添加到 BUILD.gn 文件中。现在,您可以将该组添加到 //sdk/ctf/tests:tests 中。

4. 添加 GN 模板以构建预构建 CTF 测试

如需教 CTF 如何将测试的预构建软件包构建到可运行的目标中,请创建一个 GN 模板,该模板会生成与用于运行最新版本的测试的 fuchsia_test_package 完全相同的软件包。例如,如果测试根组件和测试软件包如下所示:

fuchsia_test_component("fuchsia-example-test-root") {
  testonly = true
  manifest = "meta/fuchsia-example-test-root.cml"
  test_type = "ctf"
}

fuchsia_test_package("fuchsia-example-tests-latest") {
  test_components = [ ":fuchsia-example-test-root" ]
  subpackages = [
    ":fuchsia-example-tests", # latest version of the test suite.
    ":fuchsia-example-test-realm-factory",
  ]
  deps = [ ":fuchsia-example-test-helper" ]
}

然后将此模板添加到 //sdk/ctf/build/generate_ctf_tests.gni

template("generate_fuchsia-example-tests") {
  forward_variables_from(invoker, [ "test_info" ])
  fuchsia_package_with_test(target_name) {
    test_component = "//path/to/test:fuchsia-example-test-root",
    test_component_name = "test-root.cm"
    subpackages = [
      test_info.target_label, # prebuilt version of the test suite.
      "//path/to/test:fuchsia-example-test-realm_factory"
    ]
    deps = [ "//path/to/test:fuchsia-example-test-helper" ]
  }
}
  • 为了让 CTF 将此模板与预构建的测试软件包相匹配,此模板必须命名为 generate_{package_name},并且 package_name 必须与测试的原始 ctf_fuchsia_package 名称匹配。
  • 此模板是包含 test_info.target_label(而非 :fuchsia-example-tests)的子软件包,因为前者指向从 CIPD 构建的预构建测试版本,后者指向基于源代码构建的最新版本。

5. 测试更改

如需验证这些步骤是否已正确完成,请运行以下命令:

fx set core.x64 --with //sdk/ctf:ctf_artifacts
fx build

构建应该显示错误提示,以运行更新 //sdk/ctf/goldens/package_archives.json 的命令。请运行该命令,然后再次运行 fx build

在此阶段,如果缺少上一步中定义的 GN 模板,或者该模板无法将测试的预构建版本与 GN 模板相匹配,则 build 会输出错误。如果一切顺利,可以使用以下命令运行测试:

fx test fuchsia-example-test_ctf<N>

鉴于这是当前 build 中的预构建测试版本,而不是先前 CTF 版本中的某个版本,N 是 Fuchsia 平台目前正在开发中的 API 级别。

6. 提交更改

将更改送审。提交后,测试将自动包含在下一个 CTF 版本中,当下一个里程碑分支被切断时。如需进一步审核,请发送电子邮件至 fuchsia-ctf-team@google.com

如何从 CTF 中移除测试

如需从未来 CTF 版本中移除测试,请执行以下操作:

  1. 从 build 图中移除测试归档
  2. 删除该测试的 gn 模板
  3. 从测试的构建规则中移除 ctf 模板

将这些更改提交到主分支。随着时间的推移,与每个版本对应的所有 API 级别都将不再受支持,并且最后一个版本的测试将停止在 CQ 中运行。

如果您必须立即从 CQ 中移除某项测试及其所有预构建版本,则还要执行 Fuchsia 的变更控制流程,并择优挑选从每个相应的版本分支中移除测试的 CL。例如,如果您要从 API 级别 20 的 CTF 版本中移除某项测试,则需要在 releases/f20 分支上择优挑选 CL。

测试要求

每个测试都必须满足这些要求,然后才能添加到 CTF 中。

CTF 测试必须使用测试领域工厂模式

测试领域工厂模式允许 build 在 CTF 中对测试套件组件进行版本控制,而无需对被测组件进行版本控制。在按照本指南操作之前,请阅读测试领域工厂指南,并在必要时重构测试。

CTF 测试必须仅依赖于面向合作伙伴的 ABI

CTF 测试在运行时必须仅依赖于合作伙伴 SDK 类别中的软件,因为该测试会强制其依赖项保持稳定。这并不是通过提交前检查来强制执行的。通常,测试作者只需验证其测试套件组件使用的 FIDL 协议是否都在 partner SDK 类别中可用。

CTF 测试必须使用 C、C++ 或 Rust 编写

在撰写本文时,CTF 仅支持这些语言。