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,用於宣告之前範例元件測試中的功能。
{
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