测试:问题和答案

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

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

答:使用适合语言的结构,例如适用于 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。 在大多数情况下,商品配置加上 --with 参数, fx set 命令缺少直接或间接地缺少 错误。如果出现这种情况,只需添加测试 GN 标签或 GN 以传递方式将测试作为 fx set--with 参数的标签 命令,例如:

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

对于某些商品配置或款式/规格配置,也可能会被停用测试。如果 在使用 fx set 添加标签后,fx test 未找到测试,请验证 测试没有被 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 漫游器收集自动运行测试输出的方式。

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

答:这有多种方法。无论何时进行此类操作 提交错误,并在停用 测试。

将测试标记为不稳定

为此,您可以在代码中添加“flaky”添加到 tags 字段, 测试环境。运行 针对整个测试目标(对应可执行文件)运行。这会导致无法实现此目标 在提交队列中的构建器上运行,并在特殊的 flaky 继续在 CI 中运行测试的构建器。请务必注意 添加注释 更改示例

如果您只想停用一些属于较大测试目标的测试 您需要将该目标拆分为两个 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.gn修改为 如下:tests = [ { name = "scenic_unittests", disabled = true } ]。作为 结果,scenic_unittests 将放入以下目录的 disabled 子目录中: /pkgfs/packages/<package_name>/0/test,且不会由 CQ 系统运行。

注释掉测试

如需停用较大测试可执行文件中的特定测试,可以添加注释, 编写出定义该测试的代码

问:如何自动运行一系列测试?如何确保所有依赖项都经过测试?

答: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 的形式提供 将在其中执行测试二进制文件的位置

TODO:如果您希望在构建流程中生成工件, 建议将生成工件的规则添加到 data_deps test_package 规则的数组。但我还没有试过。更新此内容 部分 :)