| RFC-0180:測試 UI 堆疊 | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 這份 RFC 是 Test UI Stack 元件的設計提案,將提供 UI 專屬的測試功能,用於測試樹狀結構內外的用戶端。 |
| 問題 | |
| Gerrit 變更 | |
| 作者 | |
| 審查人員 | |
| 提交日期 (年-月-日) | 2022-06-16 |
| 審查日期 (年-月-日) | 2022-07-26 |
摘要
這項 RFC 是 Test UI Stack 元件的設計提案,可為樹狀結構內外的測試用戶端提供 UI 專屬的測試功能。
提振精神
整合測試是 Fuchsia 花瓣穩定性的必要條件。不過,由於 OOT 用戶端在編寫這類測試時會遇到重大障礙,因此目前樹狀結構外 (「OOT」) 密封式 UI 整合測試並不多。具體來說,他們必須:
- 瞭解 UI 堆疊的深奧知識,通常遠超出其生產用途的範圍。
- 將測試行為與 UI 堆疊的內部實作詳細資料配對。
- 使用僅限內部使用的 FIDL API 執行相關 UI 元件。
- 設計測試,確保 UI 堆疊 (GFX -> flatland、根層級簡報者 -> 場景管理員、CFv1 -> CFv2) 進行各種遷移作業時,測試都能正常運作。
測試 UI Stack 元件的目標是代表測試用戶端處理低層級的 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 測試和 Fuchsia 輸入團隊的設計審查。我們也諮詢了 OOT UI 用戶端團隊。
詞彙解釋
- UI 堆疊:這組 Fuchsia 元件會提供必要的 UI 服務。 大致來說,這組項目包括場景、根層級簡報者或場景管理員、輸入管道、無障礙管理員、快速鍵管理員和文字管理員。
- 測試 UI 堆疊:建議使用的元件,可公開 UI 堆疊的介面 (基本 UI 服務 + 輔助服務)。
- 基礎 UI 服務:從生產 UI 領域公開的一組服務。
- 輔助服務:僅供測試的服務,可透過較高層級的 API,將低層級的 UI 功能轉送給用戶端。
- 場景:檢視區塊的階層,可讓擁有者向螢幕顯示可算繪的內容、取用輸入內容,以及與無障礙功能互動。
設計
需求條件
- 涉及 UI 的密封 OOT 整合測試必須容易編寫。
- 涉及 UI 的密封 OOT 整合測試必須可讀取。
- 測試功能不得洩漏 UI 堆疊的內部資訊。
- 用戶端必須能夠設定包含 UI 堆疊的測試領域。
- 用戶端必須能夠擴充 Test UI Stack 定義的元件拓撲,納入測試專屬設定。
- 測試必須保證能乾淨俐落地設定及拆除。
- 測試必須彼此獨立。
- 測試 UI 堆疊不得妨礙 RealmBuilder 的使用。
- 客戶必須能以所選語言撰寫測試。
建議條件
- 樹內和樹狀結構外 UI 整合測試應直接類似。
總覽
我們建議在 Fuchsia 合作夥伴 SDK 中新增 Test UI Stack 元件,公開生產 UI 領域的介面。具體來說,這個元件會公開下列服務:
- 大致來說,這組公開服務是從實際執行環境 UI 領域公開。
- 一組僅供測試的「輔助服務」,透過較高層級的抽象化 (例如輸入合成、螢幕截圖等) 提供低層級的 UI 功能。
用戶端可以例項化這個元件、將必要的 UI 服務轉送至受測元件、向場景呈現檢視畫面,並使用各種輔助服務來執行測試。

請注意,這個設計與 UI 堆疊和測試元件如何設定各自的領域無關。可透過靜態方式或 RealmBuilder 進行。
基礎 UI 拓撲
最初,測試 UI 堆疊會包含下列基本 UI 元件,這些元件與撰寫本文時的「現代」正式版 UI 堆疊相符:
- 風景優美,設定為使用平地。
- 場景管理員
- 無障礙管理員
- 文字管理員
- 快速鍵管理員
- Cobalt (並非 UI 元件,但執行 Scenic 時必須使用)
- 虛擬硬體螢幕控制器 (同樣不是 UI 元件,但 scenic 需要這個元件)
此外,測試 UI 堆疊一開始會向測試公開下列基本 UI 服務:
- fuchsia.accessibility.semantics.SemanticsManager
- fuchsia.ui.composition.Allocator
- fuchsia.ui.composition.Flatland
- fuchsia.ui.scenic.Scenic
- fuchsia.ui.input.ImeService
- fuchsia.ui.input3.Keyboard
- fuchsia.ui.input3.KeyEventInjector
- fuchsia.ui.shortcut.Manager
- fuchsia.ui.shortcut.Registry
請注意,測試 UI 堆疊可能會演變,並反映正式環境的堆疊。
視 One UI Stack 遷移作業的進度而定,我們也可能會新增「舊版」的 Test UI Stack 元件變體,使用根層級簡報者和輸入管道,取代場景管理工具。
輔助元件
除了上述基本 UI 元件,測試 UI 堆疊還會包含一組範圍狹窄的輔助元件,透過高階 API 為用戶端提供低階 UI 專屬功能。這組設定在推出時可能包含:
- 輸入合成元件,可讓用戶端直接將文字、滑鼠和觸控輸入內容插入輸入管道。
- 螢幕截圖元件,可讓用戶以符合人體工學的方式擷取螢幕截圖。
- 場景供應器元件,用於將用戶端檢視區塊附加至場景,並代表用戶端註冊具備權限的輔助功能 (例如範圍幾何圖形觀察器)。請注意,由於場景供應器會代表用戶端註冊觀察器,因此測試 UI 堆疊「不需要」公開任何觀察器登錄服務。
測試 UI 堆疊會公開這些元件的輔助服務,用戶端可用於執行測試。
輔助元件抽象化提供幾項重要優點:
- 抽象化:輔助服務會向用戶端提供穩定且定義完善的外觀,有助於盡量減少對 UI 堆疊內部項目的依附元件。
- 簡單易用:透過專用輔助元件提供 UI 功能,可確保每個 FIDL API 簡單且具體,進而提升撰寫及維護 UI 測試的 DX。
- 可擴充性:我們可以新增輔助元件,輕鬆擴充 UI 外觀。
- 與子封裝相容:我們可以轉換至子封裝,且不會造成用戶端功能遺失。
可設定性
部分用戶端可能需要設定顯示器旋轉、像素密度等參數。測試 UI 堆疊可透過結構化元件設定因應這些用途。用戶端可以覆寫要控制的參數,然後 Test UI Stack 元件會將這些參數傳播至適當的基礎 UI 元件。
使用範例
下列虛擬 C++ 程式碼片段使用 Test UI Stack 元件,說明基本觸控輸入測試。
// 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(...);
實作
下列工作流程可並行進行。
工作流程:場景供應商輔助服務
- Land FIDL 變更。
- 導入場景供應器輔助元件。
- 重構現有的樹狀結構內測試,以使用場景供應器。
這個工作流程可讓測試將檢視區塊附加至場景,這是任何圖形/輸入測試的硬性規定。
工作流程:幾何觀察器
- 在 SDK 中提供
fuchsia.ui.observation.geometry通訊協定 OOT。 - 實作「範圍」幾何圖形觀察器登錄。
OOT 客戶可透過這個工作流程使用幾何圖形觀察器資料,不必理會場景圖的根,因為這可能會因產品和 UI 堆疊設定而異。
工作流程:輸入合成
- 重新設計輸入合成 API,供 OOT 使用。
- 將輸入合成 FIDL 程式庫新增至 SDK。
- 實作 FIDL 程式庫。
OOT 測試 UI 堆疊使用者可透過這個工作流程注入輸入內容,目前沒有替代方案。
工作流程:重構樹狀結構內 UITestManager 程式庫
- 將領域設定從現有的內部 UITestManager 類別中排除, 放入新的 UITestRealm 類別,該類別可與測試 UI 堆疊共用。
- (選用) 導入機制,將 .cml 分享給正式版 UI 子領域。如果不是現在,我們應該在 One UI Stack 遷移完成後進行這項清理作業。
完成上述工作流程後,我們即可在合作夥伴 SDK 中組裝測試 UI 堆疊套件,並將其新增至 OOT 用戶端執行測試的產品建構版本。
效能
這項設計的目標是已包含多個元件的整合測試,因此我們預期所提議的測試拓撲擴充功能,對效能的影響極小。
部分 OOT 測試的效能實際上可能會提升,因為這些測試可依賴更穩定的同步模式。
安全性考量
本 RFC 沒有任何安全性考量。由於測試 UI 堆疊不會耗用任何系統功能 (sysmem 和 vulkan 除外),因此無法執行一般使用者 vulkan 程式無法執行的任何動作。
隱私權注意事項
測試 UI 堆疊無法存取私人或機密資源,因此本 RFC 沒有隱私權考量。
測試
編寫測試來使用 Test UI Stack 時,我們對其行為的信心會越來越充足。
說明文件
我們打算發布開發人員指南,說明如何使用測試 UI 堆疊。
缺點、替代方案和未知事項
缺點
在不同客戶之間重複使用樣板
建議的設計會讓用戶端留下一些常見的樣板來撰寫。我們或許可以透過 fuchsia.test.Suite 的自訂 UI 專屬實作項目,消除這個痛點,讓用戶端將測試用戶端和測試邏輯插入預先定義的 UI 測試架構。
考慮的替代方案
請參閱原始的 UI 測試管理員 RFC。