测试:问题和答案

欢迎您在此处添加您自己的问题(和答案)!

问:如何定义新的单元测试?

答:使用适合语言的构造,例如适用于 C++ 的 GTest。您可以根据需要定义一个新文件,例如:

(在 BUILD.gn 文件中)

executable("unittests") {
  output_name = "scenic_unittests"
  testonly = true
  sources = ["some_test.cc"],
  deps = [":some_dep"],
}

问:怎样确保它能正常运行?

答:测试在 FUCHSIA_BUILD_DIR/tests.json 文件中表示为条目,该文件由 GN 根据 fx set 的参数生成的条目。创建或更新 tests.json 的步骤称为 build 的生成阶段,由 fx setfx buildfx gen 明确触发。

如果 fx test 未找到您的测试,请先检查 FUCHSIA_BUILD_DIR/tests.json。在大多数情况下,产品配置和 fx set 命令的 --with 参数都直接或传递缺少您尝试运行的测试。在这种情况下,只需将测试 GN 标签或以 --with 参数的形式传递测试的 GN 标签添加到 fx set 命令即可,例如:

fx set ... --with //src/sys:tests

对于某些商品或款式/规格配置,系统也可能会停用测试。如果 fx test 在您使用 fx set 添加标签后未找到该测试,请验证该测试是否被 build 规则排除。例如,某项测试可能会被排除在覆盖率变体中。这可以在测试的 BUILD.gn 文件中如下所示:

group("tests") {
  if (!is_coverage) {
    deps = [ ":my-test" ]
  }
}

如果新添加的测试在 fx set 定义的产品配置中,但仍未显示在 tests.json 中,您可能需要运行 fx genfx build 来更新 tests.json,以便 fx test 知道如何运行该测试。

问:如何在 QEMU 实例上运行此单元测试?

如果您的 QEMU 具有网络,则有一种简单的方法;如果没有网络,则很难。

A(使用网络):在一个终端中,使用 fx qemu -N 启动 QEMU 实例。 接下来,在另一个终端上输入 fx test escher_tests

此调用会运行 escher_tests 软件包中的所有测试可执行文件。

A(无网络):启动一个 QEMU 实例 (fx qemu),然后手动调用 run-test-suite 命令。

在 QEMU shell 中,输入 run-test-suite <test_url>

注意!如果没有网络连接,文件会在启动时加载到 QEMU 实例中。因此,在重新构建测试后,您需要关闭并重启 QEMU 实例才能看到重新构建的测试。

如需退出 QEMU,请运行 dm shutdown

问:如何在开发设备上运行此单元测试?

答:手动调用(例如在 QEMU 中)或对正在运行的设备 fx test 调用。

请注意,已启动的设备在启动时可能不包含您的二进制文件,但 fx test 会构建测试二进制文件,将其传送到设备并运行,同时通过管道将输出内容传回您的工作站终端。好滑!

确保您的设备正在运行(按 Ctrl-D 启动现有映像)并已连接到您的工作站。

在工作站上,fx test escher_tests 将按顺序运行 escher_tests 软件包中包含的所有测试可执行文件。

若要仅运行一个测试可执行文件,请使用以下命令:

fx test <executable-name>

您可以使用 fx -i 在每次源文件更改时自动重新构建、安装并运行测试。例如:fx -i test escher_tests

问:在哪里获取测试结果?

答:输出会定向到您的终端。

确实有一种方法可以将测试输出写入文件(包括摘要 JSON 文件),而 CQ 聊天机器人就是通过这种方式收集自动运行的测试输出。

问:如何停用测试?如何查找并运行已停用的测试?

答:您可以采用多种方法。执行上述任一操作时,请务必提交 bug,并在停用测试的代码的注释中引用该 bug。

将测试标记为不稳定

为此,您可以将“不稳定”添加到测试环境中的 tags 字段。此操作会对整个测试目标(对应于一个可执行文件)运行。这样可以阻止此目标在提交队列中的构建器上运行,并在继续在 CI 中运行测试的特殊不稳定构建器上启用目标。请务必注意 BUILD.gn 文件中注释中的 bug。更改示例

如果您只想停用属于较大测试目标的部分测试,则需要将目标拆分为两个 GN 目标,并将其中一个标记为不稳定。

仅限 C++ googletest:前缀名称带有 DISABLED

如需在较大的测试可执行文件中停用特定测试,您可以将其标记为已停用。如需定义已停用的测试,请将其名称以 DISABLED_ 为前缀。因此,找到它们的方法之一就是使用 git grep DISABLED_

如需强制运行已停用的测试,请使用以下命令:fx test escher_tests --also-run-disabled-tests

仅限 Rust:应用 #[ignore] 属性

如需在较大的 Rust 测试可执行文件中停用特定测试,您可以使用 #[ignore] 标记该测试。它应应用于 #[test] 属性下。

示例:

#[test]
#[ignore] // TODO(https://fxbug.dev/NNNNN) re-enable this test when de-flaked
fn flaky_test_we_need_to_fix() { ... }

将测试标记为已停用

或者,您也可以停用包含多个测试可执行文件的软件包中的整个测试可执行文件。为此,请按如下方式修改 BUILD.gntests = [ { name = "scenic_unittests", disabled = true } ]。因此,scenic_unittests 会被放置在 /pkgfs/packages/<package_name>/0/testdisabled 子目录中,并且 CQ 系统不会运行 scenic_unittests

为测试添加注释

如需在较大的测试可执行文件中停用特定测试,您可以将定义该测试的代码注释掉。

问:如何自动运行多个测试?如何确保测试所有依赖项?

答:fx test 的主要功能是批量执行。如需查看有关如何一起运行多个测试或测试套件的示例,请参阅运行 Fuchsia 测试

此外,您可以随时将补丁上传到 Gerrit,并执行 CQ 试运行。

问:如何在 CQ 试运行中运行此单元测试?

答:点击 CQ 试运行(也称为 +1)后,系统会对更改进行正确定义的单元测试,并在多个聊天机器人上运行测试,每个聊天机器人对应一个构建目标(x86-64arm64releasedebug)。每个作业都有一个输出页面,其中显示运行的所有测试。

问:如何在单元测试中使用一些构建时工件?

答:最简单的工件只是源目录中的一个文件。为此,您只需将其添加到单元测试的软件包定义的 resources 属性中即可。例如,您可以在 BUILD.gn 中执行如下操作:

rustc_binary("my-great-app") {
  with_unit_tests = true

  ...
}

test_package("my-great-app-tests") {
  deps = [
    ":my-great-app_test",
  ]

  resources = [
    {
      path = "source.zip"
      dest = "testing.zip"
    }
  ]

在将要执行测试二进制文件的环境中,文件将以 /pkg/data/testing.zip 的形式提供。

待办事项:如果您需要在构建流程中生成的工件,可能应该将用于生成工件的规则添加到 test_package 规则的 data_deps 数组中。但我还没有试用过。请在试用时更新此部分 :)