Fuchsia「Test Runner Framework」可讓開發人員使用各種語言和執行階段,為元件建構測試,並在目標裝置上執行。這個架構提供實作 fuchsia.test.Suite
通訊協定的測試執行器元件,並整合常見的語言測試架構,例如 GoogleTest (C++)。
test_manager
元件負責在 Fuchsia 裝置上執行測試。這會檢查實作測試套件通訊協定的元件,並以子項元件的形式啟動這些元件。這表示 test_manager
也會負責為每個測試套件提供功能,建立通常稱為「測試領域」。
開發人員工具 (例如 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 的對等測試執行元件 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
元件中新增單元測試,並在 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(
"@rules_fuchsia//fuchsia:defs.bzl",
"fuchsia_cc_binary",
"fuchsia_cc_test",
"fuchsia_component",
"fuchsia_component_manifest",
"fuchsia_package",
"fuchsia_test_package",
"if_fuchsia",
)
新增下列建構規則,將測試納入建構設定:
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"] + if_fuchsia([
"@fuchsia_sdk//pkg/fdio",
"@fuchsia_sdk//pkg/sys_cpp",
"@fuchsia_sdk//pkg/syslog",
]),
)
fuchsia_test_package(
name = "test_pkg",
package_name = "echo_unittests",
visibility = ["//visibility:public"],
components = [
":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