组件测试

借助 Fuchsia 测试运行程序框架,开发者可以针对 使用各种语言和运行时环境的组件,并在 目标设备。该框架提供了可实现以下功能的测试运行程序组件: fuchsia.test.Suite 协议,并与通用语言特有的集成 测试框架,例如 GoogleTest (C++)。

test_manager 组件负责在 Fuchsia 上运行测试 设备。它会检查实现测试套件协议的组件并启动 将它们视为子组件这意味着,test_manager 还负责 为每个测试套件提供功能,从而创建通常称为 test Realm

展示测试运行程序框架如何为
让开发者可以公开测试套件,让开发者工具
Fuchsia 设备。

ffx test 等开发者工具会与 test_manager 上的 来执行测试套件并检索结果。

测试运行程序

测试运行程序是测试运行程序框架和常见测试运行程序之间可重复使用的适配器 供开发者使用其首选语言编写测试的框架。 每个测试运行程序组件都公开 fuchsia.test.Suite 功能, 使 test_manager 能够枚举和执行各个测试,以及 声明具有测试框架支持的适当执行 runner

{
    // Execute tests using language-specific runner
    program: { runner: "elf_test_runner", },
    // Expose test suite protocol to test manager
    capabilities: [
        { protocol: "fuchsia.test.Suite" },
    ],
    expose: [
        {
            protocol: "fuchsia.test.Suite",
            from: "self",
        },
    ],
}

为了简化集成,测试运行程序框架提供了清单分片 。以下是等效的测试运行程序 用于声明先前示例组件测试中功能的 CML。

{
    include: [ "sys/testing/elf_test_runner.shard.cml" ]
}

单元测试

单元测试侧重于测试 如何验证组件中的各个代码单元 来自系统上其他组件的数据单元测试应该是封闭测试,也就是说 不要求或在测试之外提供额外功能。

Fuchsia SDK 提供了额外的模板来 单元测试组件:

  • fuchsia_cc_test():将 C++ 源代码编译为测试二进制文件。时间 添加到软件包时,此规则也会生成最小的组件清单, 引用的是测试二进制文件,不需要其他功能。
  • fuchsia_test_package():生成包含一个或多个 Fuchsia 软件包的 Fuchsia 软件包 测试组件及其依赖项。

以下是用于添加单元测试的 BUILD.bazel 代码段示例:

load(
    "fuchsia_cc_test",
    "fuchsia_select",
    "fuchsia_test_package",
)

fuchsia_cc_test(
    name = "hello_world_test",
    srcs = ["hello_world_test.cc"],
    deps = fuchsia_select({
      "@platforms//os:fuchsia": [
        "@fuchsia_sdk//pkg/fdio",
        "@fuchsia_sdk//pkg/syslog",
      ],
    }),
)

fuchsia_test_package(
    name = "unit_test_pkg",
    visibility = ["//visibility:public"],
    deps = [
      ":hello_world_test",
    ],
)

练习:Echo 单元测试

在本练习中,您将使用echo 测试运行程序框架,并在 FEMU 环境中运行这些测试。

完成本部分后,项目应具有以下目录 结构:

//fuchsia-codelab/echo
                  |- BUILD.bazel
                  |- meta
                  |   |- echo.cml
                  |
                  |- echo_component.cc
                  |- echo_component.h
                  |- echo_unittest.cc 
                  |- main.cc
  • echo_unittest.cc:C++ 单元测试的源代码。

实现单元测试

单元测试会验证组件的内部函数的行为是否与 符合预期。对于 echo 组件,您需要验证 greeting() 函数会返回预期值。

创建 echo/echo_unittest.cc 并将以下单元测试函数添加到 在向 greeting() 函数提供 1、2、 或三个参数:

echo/echo_unittest.cc

#include <gtest/gtest.h>

#include "echo_component.h"

TEST(EchoTest, TestGreetOne) {
  std::vector<std::string> names = {"Alice"};
  std::string expected = "Alice";
  ASSERT_TRUE(echo::greeting(names) == expected);
}

TEST(EchoTest, TestGreetTwo) {
  std::vector<std::string> names = {"Alice", "Bob"};
  std::string expected = "Alice and Bob";
  ASSERT_TRUE(echo::greeting(names) == expected);
}

TEST(EchoTest, TestGreetThree) {
  std::vector<std::string> names = {"Alice", "Bob", "Spot"};
  std::string expected = "Alice, Bob, Spot";
  ASSERT_TRUE(echo::greeting(names) == expected);
}

运行单元测试

更新 echo/BUILD.bazel 文件的 imports 部分,在其中添加 其他测试规则:

echo/BUILD.bazel

load(
    "@fuchsia_sdk//fuchsia:defs.bzl",
    "fuchsia_cc_binary",
    "fuchsia_cc_test",
    "fuchsia_component",
    "fuchsia_component_manifest",
    "fuchsia_package",
    "fuchsia_select",
    "fuchsia_unittest_package",
)

添加以下构建规则,将您的测试包含在 build 配置中:

echo/BUILD.bazel

fuchsia_cc_test(
    name = "echo_unittests",
    size = "small",
    srcs = [
        "echo_component.cc",
        "echo_component.h",
        "echo_unittest.cc",
    ],
    visibility = ["//visibility:public"],
    deps = ["@com_google_googletest//:gtest_main"] + fuchsia_select({
        "@platforms//os:fuchsia": [
            "@fuchsia_sdk//pkg/fdio",
            "@fuchsia_sdk//pkg/syslog",
        ],
    }),
)

fuchsia_unittest_package(
    name = "test_pkg",
    package_name = "echo_unittests",
    visibility = ["//visibility:public"],
    unit_tests = [
        ":echo_unittests",
    ],
)

此规则会将您的单元测试打包到具有以下网址的组件中:

fuchsia-pkg://fuchsiasamples.com/echo_unittests#meta/echo_unittests.cm

构建测试软件包并将其发布到 fuchsiasamples.com 代码库:

bazel run //fuchsia-codelab/echo:test_pkg.publish -- \
    --repo_name fuchsiasamples.com

使用 ffx test 命令执行此软件包中的单元测试。 验证测试是否通过:

ffx test run \
    fuchsia-pkg://fuchsiasamples.com/echo_unittests#meta/echo_unittests.cm