为 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

  • 为了使 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 仅支持这些语言。