元件測試

Fuchsia Test Runner Framework 可讓開發人員為 並使用不同語言與執行階段的元件 目標裝置。這個架構提供測試執行器元件, fuchsia.test.Suite 通訊協定,並與常見的特定語言整合 這些測試架構,例如 GoogleTest (C++)

test_manager 元件負責在 Fuchsia 上執行測試 裝置。檢查實作測試套件通訊協定並啟動的元件 做為子項元件也就是說,test_manager 也必須負責 為每個測試套件提供功能,建立所謂的 測試領域

這張圖表顯示測試執行器架構如何為
公開測試套件,並讓開發人員工具能執行測試
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 套件 測試元件及其依附元件

以下是納入單元測試的 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 元件中: 測試 Runner 架構,並在 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() 函式的行為 三個引數

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 檔案的匯入部分,以加入 額外的測試規則:

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",
)

新增下列建構規則,在建構設定中加入測試:

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