RFC-0180:測試 UI 堆疊

RFC-0180:測試 UI 堆疊
狀態已接受
區域
  • 查看系統
說明

這項 RFC 是「測試 UI 堆疊」元件的設計提案,提供 ui 專用的測試功能,以便測試樹狀結構外用戶端。

問題
變更
  • 691540
作者
審查人員
提交日期 (年/月)2022-06-16
審查日期 (年/月)2022-07-26

摘要

這項 RFC 是測試 UI 堆疊元件的設計提案,該元件提供 UI 專屬的測試功能,以便測試樹狀結構內外的用戶端。

提振精神

整合測試是 Fuchsia 寵物穩定性的關鍵。不過,由於 OOT 用戶端在撰寫程式碼時遇到了大量的障礙,因此,目前仍然有一些樹狀結構外 (「OOT」) 的密封 UI 整合測試。亦即他們必須:

  • 瞭解 UI 堆疊的特點,通常不在實際工作環境用途的範圍內。
  • 將測試行為與 UI 堆疊內部實作詳細資料結合。
  • 請使用內部專用 FIDL API 執行相關 UI 元件。
  • 設計測試,有效應對 UI 堆疊中的各種遷移作業,例如 GFX -> Flatland、根簡報者 -> 場景管理員、CFv1 -> CFv2。

測試 UI 堆疊元件旨在代表測試用戶端處理低階 UI 詳細資料,藉此降低這些問題。

應用情境範例

  • 用戶端執行階段的觸控/滑鼠/鍵盤輸入測試:針對這類測試,用戶端會顯示測試 UI 堆疊,並在場景中附加一個檢視畫面,直到檢視畫面樹狀結構狀態結束、插入輸入內容,然後觀察檢視畫面處理傳入事件的方式。
  • 應用程式測試:這些測試可針對 UI 堆疊執行應用程式的部分內容,並觀察其如何轉譯內容、處理輸入內容、與無障礙功能互動等等。
  • UI 相鄰測試:部分未明確執行 UI 功能的測試,可能還是需要 UI 狀態。舉例來說,針對 fuchsia.web 的測試,可能需要測試用戶端才能顯示檢視畫面。

相關人員

誰擔心是否接受這個 RFC?(本節為選填,但建議填寫)。

講師:

leannogasawara@google.com

審查者:

  • Fuchsia 測試架構:crjohns@google.com
  • UI + OOT 整合測試:dworsham@google.com、jaeheon@google.com

顧問:

列出應審查 RFC,但不需要經過核准的人員。

  • 輸入:quiche@google.com, neelsa@google.com
  • 無障礙工具:neelsa@google.com、lucasradaelli@google.com
  • 元件架構:yaneury@google.com、geb@google.com、cgonyeo@google.com
  • Flutter:akbiggs@google.com
  • Chromium:sergeyu@google.com
  • Opal:cligh@google.com、anwilson@google.com、robinsontom@google.com

社群媒體化:

這項 RFC 與 Fuchsia Testing 和 Fuchsia 輸入團隊一起進行設計審查。我們也諮詢了 OOT UI 客戶團隊。

詞彙解釋

  • UI 堆疊:搭載重要 UI 服務的 Fuchsia 元件組合,大致來說,這個組合包括風景優美的根簡報者或場景管理員、輸入管道、無障礙功能管理員、捷徑管理工具和文字管理工具。
  • 測試 UI 堆疊:公開 UI 堆疊外牆 (基本 UI 服務 + 輔助服務) 的元件。
  • 基礎 UI 服務:從實際工作環境 UI 公開的一組服務。
  • 輔助服務:僅供測試使用的服務,這類服務會透過高階 API 向用戶端代理低階 UI 功能。
  • 情境檢視畫面的階層,可讓擁有者向螢幕呈現可算繪的內容、使用輸入內容,以及與無障礙功能互動。

設計

相關規定

  • 涉及 UI 的密封 OOT 整合測試必須易於編寫。
  • 涉及 UI 的密封 OOT 整合測試必須清晰可讀。
  • 測試預設用途不得外洩 UI 堆疊的內部。
  • 用戶端必須能夠設定包含 UI 堆疊的測試領域。
  • 用戶端必須能夠擴充測試 UI 堆疊定義的元件拓撲,納入測試專用的設定。
  • 務必確保設定及拆卸測試。
  • 測試必須彼此獨立。
  • 測試 UI 堆疊不得預先使用 RealmBuilder。
  • 用戶端必須能自行選擇語言撰寫測試。

建議配手

  • 樹狀結構內和樹狀結構外 UI 整合測試應直接類似。

簡介

我們提議將測試 UI 堆疊元件加入 Fuchsia 合作夥伴 SDK,以公開實際運作環境的 UI 領域。具體來說,這個元件會公開下列服務:

  1. 大致而言,這是在生產 UI 中對外公開的公共服務組合。
  2. 一組僅供測試使用的「輔助服務」,會透過高階抽象化 (例如輸入合成、螢幕截圖等) 提供低階 UI 功能。

用戶端可以對此元件執行個體化、將必要的 UI 服務轉送至受測試的元件、向場景顯示檢視畫面,以及使用各種輔助服務來驅動測試。

替代文字:元件拓撲顯示:

請注意,這項設計不適用於 UI 堆疊和測試元件設定各自的運作範圍。可透過靜態方式或透過 RealmBuilder 完成這項作業。

基礎 UI 拓撲

測試 UI 堆疊一開始會包含下列基本 UI 元件,這些元件會在寫入時鏡像到「現代化」實際工作環境 UI 堆疊:

  1. 風景,設定為採用平地。
  2. 場景管理員
  3. 無障礙管理工具
  4. 文字管理工具
  5. 捷徑管理員
  6. Cobalt (非 UI 元件,但必須提供執行景觀)
  7. 假的硬體顯示控制器 (同樣是 UI 元件,但這是視覺元素需要)

此外,測試 UI 堆疊一開始會向測試公開下列基本 UI 服務:

  1. fuchsia.accessibility.semantics.SemanticsManager
  2. fuchsia.ui.composition.Allocator
  3. fuchsia.ui.composition.Flatland
  4. fuchsia.ui.scenic.Scenic
  5. fuchsia.ui.input.ImeService
  6. fuchsia.ui.input3.Keyboard
  7. fuchsia.ui.input3.KeyEventInjector
  8. fuchsia.ui.shortcut.Manager
  9. fuchsia.ui.shortcut.Registry

請注意,測試 UI 堆疊可以並逐漸發展,以與實際工作環境的堆疊顯示。

單一 UI 堆疊遷移進度而定,我們也可能為測試 UI 堆疊元件新增「舊版」的變化版本,該版本採用根簡報者和輸入管道,取代場景管理員。

輔助元件

除了上述基礎 UI 元件,測試 UI 堆疊也會包含一組限定範圍的輔助元件,透過較高層級的 API 為用戶端提供低階 UI 專屬功能。此組合發布時可能包含:

  1. 輸入合成元件,可讓用戶端直接將文字、滑鼠和觸控輸入插入至輸入管道。
  2. 螢幕截圖元件,可讓用戶端依人體工學擷取螢幕截圖。
  3. 場景提供者元件,用於將用戶端檢視畫面附加至場景,並代表其註冊特殊權限預設用途 (例如範圍的幾何圖形觀測器)。請注意,由於場景供應器會代表用戶端註冊觀察器,因此測試 UI 堆疊「不需要」公開任何觀察器登錄服務。

測試 UI 堆疊會從這些元件公開輔助服務,用戶端可用於升級測試。

輔助元件抽象化有幾項重要優點:

  • 抽象化:輔助服務會向用戶端顯示穩定且定義明確的門面,有助於盡量減少 UI 堆疊內部的依附元件。
  • 簡單:透過專屬輔助元件跳出 UI 功能,可讓每個 FIDL API 簡單且具體,有助於改善 DX 以進行編寫及維護 UI 測試。
  • 可擴充:我們可以新增輔助元件,輕鬆擴展 UI 門面。
  • 與子套件相容性:我們可以轉換至沒有功能損失的子套件給用戶端。

設定

部分用戶端可能需要設定螢幕旋轉、像素密度等參數。測試 UI 堆疊只要使用結構化元件設定,即可滿足這些用途。用戶端可以覆寫想控制的參數,讓測試 UI 堆疊元件傳播至適當的基本 UI 元件。

使用範例

下方的虛擬 C++ 程式碼片段概述使用測試 UI 堆疊元件的基本觸控輸入測試。

// Client test code creates a RealmBuilder instance.
component_testing::RealmBuilder realm_builder;

// Instantiate Test UI Stack component by absolute URL in the test realm.
realm_builder.AddChild("test-ui-stack",
            "fuchsia-pkg://fuchsia.com/test-ui-stack#meta/test-ui-stack.cm");

// Add a test view component to the test realm, and route required UI services
// to it.
realm_builder.AddChild("test-view", ...);
realm_builder.AddRoute({
    .capabilities = {Protocol{fuchsia::ui::scenic::Scenic::Name_}},
    .source = ChildRef{"test-ui-stack"},
    .targets = {"test-view"}},
}});

// Expose fuchsia.ui.app.ViewProvider from the test view.
realm_builder.AddRoute({
    .capabilities = {Protocol{fuchsia::ui::app::ViewProvider::Name_}},
    .source = ChildRef{"test-view"},
    .targets = {ParentRef()}},
}});

// Build the test realm.
RealmRoot realm_root = realm_builder_.Build();

// Connect to the scene provider "helper service", and request to attach a
// test view to the scene.
std::optional<zx_koid_t> client_view_ref_koid;
fuchsia::ui::observation::geometry::Provider geometry_provider;
auto scene_provider = realm_root->Connect<fuchsia::ui::test::scene::Provider>();
auto view_provider = realm_root_->Connect<fuchsia::ui::app::ViewProvider>();
scene_provider->AttachView(std::move(view_provider), geometry_provider.NewRequest(),
  [&client_view_ref_koid](auto view_ref_koid) {
    // Save the client's ViewRef koid.
    client_view_ref_koid = view_ref_koid;
  });

// Wait for client view ref koid to become available.
RunLoopUntil([&client_view_ref_koid] {
  return client_view_ref_koid.has_value();
});

// Use registered geometry provider to wait for client view to render.
ASSERT_TRUE(geometry_provider.is_bound());
geometry_provider.Watch(...);
RunLoopUntil(...);

// Connect to input synthesis helper service, and use to inject input.
auto input_synthesis = realm_root->Connect<fuchsia::ui::test::input::Touch>();
input_synthesis->InjectTap(...);

實作

下方列舉的 Workstreams 可以平行進行。

Workstream:場景提供者輔助服務

  1. 發布 FIDL 變更內容。
  2. 實作場景提供者輔助元件。
  3. 重構現有樹狀結構內測試來使用場景供應器。

這個工作流程可讓測試將檢視畫面附加至場景,這是任何圖形/輸入測試的嚴格要求。

工作串流:幾何圖形觀察器

  1. 在 SDK 中提供 fuchsia.ui.observation.geometry 通訊協定 OOT。
  2. 實作「限定範圍」幾何圖形觀察器登錄。

這個工作流程可讓 OOT 用戶端使用不分場景圖根層級的幾何圖形觀測器資料,資料可能會因不同的產品和 UI 堆疊設定而異。

工作流程:輸入合成資料

  1. 重新設計用於 OOT 的輸入合成 API。
  2. 將輸入合成 FIDL 程式庫新增至 SDK。
  3. 實作 FIDL 程式庫。

這個工作流程可讓 OOT Test UI 堆疊使用者插入輸入,但今天沒有替代項目。

工作流程:重構樹狀結構內 UITestManager 程式庫

  1. 將運作範圍從現有內部 UITestManager 類別遷移至新的 UITestRealm 類別,該類別可與 Test UI 堆疊共用。
  2. (選用) 實作與實際工作環境 UI 子類別共用 .cml 的機制。如果現在不進行遷移,我們應在 One UI 堆疊遷移完成後執行這項清除作業。

上述工作流程完成後,我們就能在合作夥伴 SDK 中組合測試 UI 堆疊套件,並新增至 OOT 用戶端執行測試的產品建構作業中。

效能

這項設計以已是多元件的整合測試為目標,因此我們預期提議的測試拓撲擴充功能,將對效能的影響降到最低。

某些 OOT 測試實際上可能會依賴更穩定的同步處理模式,因此效能可能會有所提升。

安全性考量

這個 RFC 沒有任何安全性考量。由於測試 UI 堆疊不會耗用任何系統功能 (sysmem 和 vulkan 除外),因此無法執行任何一般使用者 vulkan 程式無法執行的作業。

隱私權注意事項

測試 UI 堆疊無法存取私人或敏感資源,因此這個 RFC 沒有隱私權注意事項。

測試

我們可以撰寫測試來使用「測試 UI 堆疊」的行為,

說明文件

我們希望發布一份開發人員指南,說明如何使用測試 UI 堆疊。

缺點、替代方案和未知

缺點

跨客戶複製樣板

這個提案的設計讓客戶可以使用一些常見的樣板寫作。我們或許能透過自訂 UI 專用的 fuchsia.test.Suite 實作來消除這個問題點,讓用戶端能夠將測試用戶端和測試邏輯插入預先定義的 UI 測試架構。

考慮改用的替代方案

請參閱原始 UI Test Manager RFC