整合測試著重於驗證元件與系統其他元件互動時的行為。因此,整合測試通常與主要元件分開建構,而且可能會將受測元件和其他依附元件宣告為子項。視測試的性質而定,依附元件元件可以做為模擬或虛設常式提供,以提倡測試情況是否保持不變。
測試元件
以下是簡易整合測試元件的元件資訊清單範例:
meta/integration_tests.cml
:
{
include: [
"//pkg/syslog/client.shard.cml",
"//pkg/sys/testing/elf_test_runner.shard.cml",
],
program: {
binary: "bin/client_test",
},
children: [
{
name: "service",
url: "fuchsia-pkg://fuchsia.com/foo-package-tests#meta/mock_service.cm",
},
{
name: "client",
url: "fuchsia-pkg://fuchsia.com/foo-package-tests#meta/foo_client.cm",
},
],
offer: [
{
protocol: "fuchsia.example.Foo",
from: "#service",
to: [ "#client" ],
},
],
}
這個測試元件宣告包含下列主要元素:
- 必要語言特定測試執行元件資料分割的
include
。這可讓測試管理員正確執行測試套件。 - 將受測試的元件和相依元件列為
children
。 - 在測試領域的元件之間轉送必要功能。
Fuchsia SDK 提供其他範本,以便建立整合測試元件:
fuchsia_cc_test()
:將 C++ 原始碼編譯為測試二進位檔。fuchsia_test_component()
:使用提供的元件資訊清單產生包含測試的 Fuchsia 元件。您可以將多個測試元件合併至同一個fuchsia_test_package()
。
以下範例說明如何在 BUILD.bazel
檔案中納入上述整合測試:
load(
"fuchsia_cc_test",
"fuchsia_component",
"fuchsia_component_manifest",
"fuchsia_test_component",
"fuchsia_test_package",
)
# Component under test
fuchsia_component(
name = "foo_client",
manifest = ":foo_client_manifest",
visibility = ["//visibility:public"],
)
# Test dependencies
fuchsia_component(
name = "mock_service",
manifest = ":mock_service_manifest",
visibility = ["//visibility:public"],
)
# Component containing integration tests
fuchsia_cc_test(
name = "client_integration_test",
srcs = [ ... ],
deps = [ ... ],
)
fuchsia_component_manifest(
name = "integration_test_manifest",
src = "meta/integration_tests.cml",
)
fuchsia_test_component(
name = "integration_test_component",
manifest = ":integration_test_manifest",
test_name = "client_integration_test",
visibility = ["//visibility:public"],
deps = [":client_integration_test"],
)
# Hermetic test package
fuchsia_test_package(
name = "integration_test_pkg",
visibility = ["//visibility:public"],
deps = [
":foo_client",
":mock_service",
":integration_test_component",
],
)
這項整合測試建構設定包含下列重要元素:
- 說明整合測試元件及其元件資訊清單的
fuchsia_test_component()
目標。 - 其他
fuchsia_component()
目標,代表整合測試所需的元件依附元件。 - 將測試元件及所有依附元件組成的單一密封
fuchsia_test_package()
。
練習:Echo 伺服器整合測試
在本練習中,您將新增整合測試元件,以透過測試執行器架構執行 echo_server
元件的 FIDL 通訊協定介面,並在 FEMU 環境中執行這些測試。
新增整合測試元件
首先,請在 Bazel 工作區中建立新的專案目錄:
mkdir -p fuchsia-codelab/echo-integration
完成這個部分後,專案應具有以下目錄結構:
//fuchsia-codelab/echo-integration
|- BUILD.bazel
|- meta
| |- echo_integration_test.cml
|
|- echo_integration_test.cc
建立測試元件資訊清單
建立 echo-integration/meta/echo_integration_test.cml
測試元件資訊清單,將 echo-server
元件宣告為子項,並將 Echo
通訊協定能力轉送至測試元件。
echo-integration/meta/echo_integration_test.cml
:
{
include: [
"syslog/client.shard.cml",
"sys/testing/elf_test_runner.shard.cml",
],
// Information about the program to run.
program: {
// The binary to run for this component.
binary: "bin/echo_integration_test",
},
// Child components orchestrated by the integration test.
children: [
{
name: "echo_server",
url: "#meta/echo_server.cm",
},
],
// Capabilities used by this component.
use: [
{
protocol: [ "examples.routing.echo.Echo" ],
from: "#echo_server",
},
],
// Capabilities required by components under test.
offer: [
{
protocol: [ "fuchsia.logger.LogSink" ],
from: "parent",
to: "#echo_server",
},
],
}
請注意,echo-server
執行個體來自與整合測試相同的套件。這項做法避免透過避免其他套件的元件依附元件,宣傳具有「密封式」的測試套件。
請將下列規則新增至 BUILD.bazel
檔案,在建構設定中加入整合測試元件:
echo-integration/BUILD.bazel
:
load(
"@rules_fuchsia//fuchsia:defs.bzl",
"fuchsia_cc_test",
"fuchsia_component_manifest",
"fuchsia_test_component",
"fuchsia_test_package",
)
fuchsia_cc_test(
name = "echo_integration_test",
size = "small",
srcs = ["echo_integration_test.cc"],
deps = [
"//fuchsia-codelab/echo-fidl:examples.routing.echo.fidl_cc",
"@com_google_googletest//:gtest_main",
"@fuchsia_sdk//pkg/async-default",
"@fuchsia_sdk//pkg/async-loop",
"@fuchsia_sdk//pkg/async-loop-cpp",
"@fuchsia_sdk//pkg/async-loop-default",
"@fuchsia_sdk//pkg/fdio",
"@fuchsia_sdk//pkg/component_incoming_cpp",
"@fuchsia_sdk//pkg/syslog",
],
)
fuchsia_component_manifest(
name = "test_manifest",
src = "meta/echo_integration_test.cml",
component_name = "echo_integration_test_component",
includes = [
"@fuchsia_sdk//pkg/sys/testing:elf_test_runner",
"@fuchsia_sdk//pkg/syslog:client",
],
)
fuchsia_test_component(
name = "echo_integration_test_component",
manifest = ":test_manifest",
visibility = ["//visibility:public"],
deps = [":echo_integration_test"],
)
fuchsia_test_package(
name = "test_pkg",
package_name = "echo_integration_test",
visibility = ["//visibility:public"],
components = [
":echo_integration_test_component",
"//fuchsia-codelab/echo-server:echo_server_component",
],
)
實作整合測試
整合測試會連線至 echo-server
公開的 Echo
通訊協定,方法與用戶端元件相同、傳送字串要求,並驗證預期回應。
新增下列程式碼即可實作整合測試:
echo-integration/echo_integration_test.cc
:
#include <fidl/examples.routing.echo/cpp/fidl.h>
#include <gtest/gtest.h>
#include <lib/component/incoming/cpp/service_client.h>
#include <string>
TEST(EchoIntegrationTest, TestEcho) {
zx::result client_end = component::Connect<examples_routing_echo::Echo>();
ASSERT_TRUE(client_end.is_ok());
fidl::SyncClient client{std::move(*client_end)};
std::string request("Hello, world!");
fidl::Result result = client->EchoString({request});
ASSERT_TRUE(result.is_ok());
auto response = result->response();
ASSERT_TRUE(response.has_value());
ASSERT_EQ(request, response.value());
}
更新建構設定
建構整合測試套件並發布至 fuchsiasamples.com
存放區:
bazel run //fuchsia-codelab/echo-integration:test_pkg.publish -- \
--repo_name fuchsiasamples.com
執行整合測試
fuchsia_test_package()
規則會產生含有測試元件及其依附元件的套件。整合測試元件的下列網址如下:
fuchsia-pkg://fuchsiasamples.com/echo_integration_test#meta/echo_integration_test.cm
使用 ffx test
指令執行整合測試。確認測試是否通過:
ffx test run \
fuchsia-pkg://fuchsiasamples.com/echo_integration_test#meta/echo_integration_test.cm