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: "rust_test_runner" },
// Expose test suite protocol to test manager
capabilities: [
{ protocol: "fuchsia.test.Suite" },
],
expose: [
{
protocol: "fuchsia.test.Suite",
from: "self",
},
],
}
C++
{
// Execute tests using language-specific runner
program: { runner: "gtest_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: [ "//src/sys/test_runners/rust/default.shard.cml" ]
}
C++
{
include: [ "//src/sys/test_runners/gtest/default.shard.cml" ]
}
單元測試
單元測試著重於驗證元件中的個別程式碼單元,並與系統中的其他元件隔離。單元測試應為密封的,也就是說,它們不需或提供測試以外的額外功能。
Fuchsia 建構系統提供額外的 GN 目標,方便進行元件單元測試:
fuchsia_unittest_package()
:單元件套件,可自動產生最小元件資訊清單來參照測試二進位檔,且不需要額外功能。fuchsia_unittest_component()
:元件宣告,可產生相同的最低元件資訊清單。如果您需要在同一個fuchsia_package()
中建構多個單元測試元件,這項規則就很實用。
以下是包含單元測試的 BUILD.gn
程式碼片段範例:
import("//build/components.gni")
executable("bin_test") {
sources = [ "main_test.cc" ]
deps = [
"//src/lib/fxl/test:gtest_main",
"//third_party/googletest:gtest",
]
testonly = true
}
fuchsia_unittest_package("hello-world-unittests") {
deps = [
":bin_test",
]
}
練習:回音單元測試
在本練習中,您將使用 Test Runner Framework 將單元測試新增至 echo-args
元件,並在 FEMU 環境中執行這些測試。
實作單元測試
單元測試會驗證元件的內部函式是否正常運作。針對 echo-args
元件,您將驗證先前練習中使用的 greeting()
函式是否傳回預期的值。
新增下列單元測試函式,驗證 greeting()
函式在提供一、兩或三個引數時的行為:
荒漠油廠
echo-args/src/main.rs
:
#[cfg(test)]
mod tests {
#[fuchsia::test]
async fn test_greet_one() {
let names = vec![String::from("Alice")];
let expected = "Alice";
assert_eq!(super::greeting(&names), expected);
}
#[fuchsia::test]
async fn test_greet_two() {
let names = vec![String::from("Alice"), String::from("Bob")];
let expected = "Alice and Bob";
assert_eq!(super::greeting(&names), expected);
}
#[fuchsia::test]
async fn test_greet_three() {
let names = vec![String::from("Alice"), String::from("Bob"), String::from("Spot")];
let expected = "Alice, Bob, Spot";
assert_eq!(super::greeting(&names), expected);
}
}
C++
echo-args/echo_unittest.cc
:
#include <gtest/gtest.h>
#include "vendor/fuchsia-codelab/echo-args/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);
}
更新建構設定
將下列規則新增至 BUILD.gn
檔案,產生新的單元測試套件:
荒漠油廠
echo-args/BUILD.gn
:
group("tests") {
testonly = true
deps = [ ":echo-args-unittests" ]
}
fuchsia_unittest_package("echo-args-unittests") {
deps = [ ":bin_test" ]
}
C++
echo-args/BUILD.gn
:
group("tests") {
testonly = true
deps = [ ":echo-args-unittests" ]
}
executable("unittests") {
output_name = "echo-args-test"
testonly = true
sources = [ "echo_unittest.cc" ]
deps = [
":cpp-lib",
"//src/lib/fxl/test:gtest_main",
"//third_party/googletest:gtest",
]
}
fuchsia_unittest_package("echo-args-unittests") {
deps = [ ":unittests" ]
}
這個規則會將單元測試封裝至具有下列網址的元件:
fuchsia-pkg://fuchsia.com/echo-args-unittests#meta/echo-args-unittests.cm
執行單元測試
更新頂層建構目標,即可建構元件套件和測試套件:
荒漠油廠
echo-args/BUILD.gn
:
import("//build/components.gni")
import("//build/rust/rustc_binary.gni")
group("echo-args") {
testonly = true
deps = [
":package",
":tests",
]
}
C++
echo-args/BUILD.gn
:
import("//build/components.gni")
group("echo-args") {
testonly = true
deps = [
":package",
":tests",
]
}
再次執行 fx build
以建構測試套件:
fx build
使用 ffx test
指令執行此套件中的單元測試。驗證測試是否通過:
ffx test run \
fuchsia-pkg://fuchsia.com/echo-args-unittests#meta/echo-args-unittests.cm