如何向 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 版本中移除测试,请执行以下操作:
将这些更改提交到主分支。随着时间的推移,与每个版本对应的所有 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 仅支持这些语言。