为 CTF 进行测试

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

如何向 CTF 添加测试

在开始之前,请先阅读 CTF 测试要求。最值得注意的要求是,测试必须使用一个 测试 realm 工厂,然后才能按照本指南进行操作。

如果测试位于 //sdk/ctf/tests:tests 的群组中,则该测试会包含在 CTF 中。 在将测试添加到此群组之前,必须重写其 build 规则以使用 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 中发布。如果 BUILD.gn 文件中不存在 group("tests")目标,请添加该目标,然后将 归档添加为依赖项:

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

您已成功向 BUILD.gn 文件添加了 group("tests")。现在,您可以 将该群组添加到//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

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

在此阶段,如果缺少在上一步中定义的 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. 从测试的 build 规则中移除 ctf 模板

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

如果您必须立即从 CQ 中移除测试及其所有预构建版本,则应按照 Fuchsia 的变更控制流程执行额外步骤,并择优挑选一个 CL,该 CL 会从每个相应的发布分支中移除测试。例如,如果您想从 API 级别 20 的 CTF 版本中移除测试,则需要将 CL 择优挑选到 releases/f20 分支上。

测试要求

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

CTF 测试必须使用测试 realm 工厂模式

借助 测试 realm 工厂 模式,build 可以在 CTF 中对测试套件组件进行版本控制,而无需对被测组件进行版本控制。在按照本指南进行操作之前,请先阅读测试大区工厂指南,并在必要时重构测试。

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

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

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

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