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",
},
],
}
為簡化整合作業,Test Runner Framework 會為每個語言專屬的執行元件提供資訊清單區塊。以下是等效的測試執行元件 CML,用於宣告先前元件測試範例中的功能。
{
include: [ "sys/testing/elf_test_runner.shard.cml" ]
}
單元測試
單元測試著重於驗證元件中的個別程式碼單元,並與系統中的其他元件隔離。單元測試應為密封的,也就是說,它們不需或提供測試以外的額外功能。
Fuchsia SDK 提供其他範本,方便您建立單元測試元件:
fuchsia_cc_test()
:將 C++ 原始碼編譯為測試二進位檔。加入套件後,這項規則也會產生最小元件資訊清單,參照測試二進位檔,且不需要額外功能。fuchsia_unittest_package()
:產生包含一或多個自動產生的單元測試元件及其依附元件的 Fuchsia 套件。
以下是包含單元測試的 BUILD.bazel
程式碼片段範例:
load(
"fuchsia_cc_test",
"fuchsia_unittest_package",
)
fuchsia_cc_test(
name = "hello_world_test",
srcs = ["hello_world_test.cc"],
deps = [
"@fuchsia_sdk//pkg/fdio",
"@fuchsia_sdk//pkg/syslog",
],
)
fuchsia_unittest_package(
name = "unit_test_pkg",
visibility = ["//visibility:public"],
unit_tests = [
":hello_world_test",
],
)
練習:回音單元測試
在本練習中,您將使用 Test Runner Framework 將單元測試新增至 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(
"@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