RFC-0180:測試 UI 堆疊

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

這個 RFC 是測試 UI 堆疊元件的設計提案,可提供 UI 專屬測試功能,以測試內外式用戶端測試用戶端。

問題
  • 102730
毛皮變化
作者
審查人員
提交日期 (年-月-日)2022-06-16
審查日期 (年-月-日)2022-07-26

摘要

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

提振精神

整合測試是 Fuchsia 寵物穩定度至關重要的關鍵。不過, 今天只有幾組現成 UI 整合測試 (OOT) 客戶在撰寫電子郵件時,遇到了重大阻礙。包括:

  • 瞭解 UI 堆疊的語意,通常超出其範圍 實際工作環境用途
  • 將測試行為與 UI 堆疊內部實作詳細資料相結合。
  • 使用僅限內部使用的 FIDL API 執行相關的 UI 元件。
  • 設計測試時,請確保測試中適用於 UI 堆疊 (GFX -> Flatland,根簡報者 -> 場景管理員,CFv1 -> CFv2)。

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

應用情境範例

  • 適用於用戶端執行階段的觸控/滑鼠/鍵盤輸入測試:在這類測試中, 用戶端會顯示測試 UI 堆疊、將檢視畫面附加至場景,然後等待 直到檢視畫面樹狀結構狀態關閉、插入輸入內容,並觀察其檢視畫面 處理傳入的事件。
  • 應用程式測試:這些測試可以執行應用程式的某些部分。 觀察應用程式如何轉譯內容、處理輸入內容 與協助工具等互動
  • UI 相鄰測試:部分未明確練習 UI 的測試 但您可能還是需要透過 UI 曝光。舉例來說 fuchsia.web 則可能需要測試用戶端才能顯示檢視畫面。

相關人員

誰會負責確認 RFC 是否已獲接受?(這個部分為選填,但 encouraged.)

講師:

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、awilson@google.com、robinsontom@google.com

社交功能:

這個 RFC 經過了 Fuchsia Testing 和 Fuchsia 的設計審查。 輸入團隊。我們也諮詢了 OOT UI 客戶團隊。

詞彙解釋

  • UI 堆疊:一組支援重要 UI 服務的 Fuchsia 元件。 這個場景中還包含範例、講者或場景管理器等 管道、無障礙管理工具、捷徑管理工具和文字管理員
  • 測試 UI 堆疊:公開 UI 堆疊立面的元件 (基本 UI 服務 + 輔助服務)。
  • 「基本 UI 服務」:對外公開的正式環境 UI 服務組合 運作範圍
  • 輔助服務:專門透過 Proxy 處理低階 UI 功能的測試服務 透過較高層級的 API 提供給用戶端
  • 情境檢視區塊的階層 讓擁有者能夠在螢幕上呈現可算繪的內容、使用輸入內容、 以及與無障礙功能互動

設計

需求條件

  • 涉及 UI 的 Hermetic OOT 整合測試必須易於編寫。
  • 必須可讀取涉及 UI 的傳統 OOT 整合測試。
  • 測試預設用途不得洩漏 UI 堆疊的內部。
  • 用戶端必須能夠設定包含 UI 堆疊的測試運作領域。
  • 用戶端必須能擴充測試 UI 定義的元件拓撲 用來納入測試專屬設定的堆疊。
  • 測試必須保證設定和拆除作業均正確無誤。
  • 測試必須彼此隔離。
  • 測試 UI 堆疊不得淘汰 RealmBuilder。
  • 用戶端必須能以所選語言撰寫測試。

建議內容

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

總覽

我們建議將測試 UI 堆疊元件新增至 Fuchsia 合作夥伴 SDK。 即可公開實際執行中 UI 領域的立面。真的 元件會公開下列服務:

  1. 大致上,公用服務集會暴露於生產環境之外。
  2. 一組僅供測試使用的「輔助服務」會幹擾低階 UI 功能 以分析模型 (例如輸入合成資料、螢幕截圖等)

用戶端可將這個元件例項化,將必要的 UI 服務轉送至 測試要測試的元件、對場景呈現畫面,並使用各種輔助程式 提升測試效率

說明文字:
顯示的元件拓撲:
測試經理 ->測試固件元件
測試固件元件 ->測試 UI 堆疊元件
測試固件元件 ->Test UI 用戶端
測試固件元件 ->輔助元件
測試固件元件 ->在地模擬
測試 UI 堆疊元件 ->輔助元件
測試 UI 堆疊元件 ->基本 UI 元件服務路徑
輔助元件 ->測試 UI 堆疊元件 (輔助服務)
基礎 UI 元件 ->測試 UI 堆疊元件 (基礎 UI 服務)
測試 UI 堆疊元件 ->測試固件元件 (基礎 UI 服務、輔助工具)
服務)
測試 UI 堆疊元件 ->test UI 用戶端 (基礎 UI 服務)
測試 UI 用戶端 ->測試固件元件 (fuchisa.ui.app.ViewProvider)
支援元件 ->測試 UI 用戶端 (支援服務)
在地模擬 ->test 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 堆疊會 加入一組範圍狹窄的輔助元件,以提供低階範圍 透過較高層級的 API 為客戶提供 UI 專屬功能。剛推出時 當中可能包含:

  1. 輸入合成元件可讓用戶端插入文字、滑鼠 直接在輸入管道中進行觸控輸入
  2. 螢幕截圖元件,可讓用戶端擷取螢幕畫面 符合人體工學
  3. 場景提供者元件,用於將用戶端檢視畫面連接至場景,以及 代表他們註冊特殊權限 (例如:限定範圍的幾何圖形) 觀察者)。請注意,因為情境提供者會代表註冊觀察器 用戶端的通訊端,測試 UI 堆疊不需公開任何觀察器登錄 免費 Google Cloud 服務

測試 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(...);

實作

下方列舉的工作流程可以平行處理。

Workstream:場景供應商輔助服務

  1. 登陸 FIDL 的變更。
  2. 實作場景提供者輔助元件。
  3. 重構現有的樹狀結構內測試,以便使用場景提供者。

這個工作流程可進行測試,將檢視畫面連接至場景, 。

工作流:幾何圖形觀察器

  1. fuchsia.ui.observation.geometry 通訊協定可在 SDK 中使用 OOT。
  2. 採用「限定範圍」幾何圖形觀察器註冊資料庫

這個工作流讓 OOT 用戶端得以跨越幾何圖形觀察器資料, 場景圖的根層級,可能因不同的產品和 UI 而異 堆疊設定

工作流程:輸入合成

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

這個工作流程可讓 OOT 測試 UI 堆疊使用者插入輸入。今天, 也沒有替代方案

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

  1. 從現有內部 UITestManager 類別因數分解領域設定, 轉換為新的 UITestRealm 類別,可與測試 UI 堆疊共用。
  2. (選用) 實作與實際工作環境 UI 共用 .cml 的機制 潛意識。如果尚未這麼做,我們應在使用 One UI 堆疊後執行這項清理作業 遷移完成。

上述工作流程完成後,我們就可以組合測試 UI 堆疊 導入合作夥伴 SDK 中套件,然後將其加進用於 OOT 的產品版本 執行測試

成效

這項設計鎖定已多元件的整合測試,因此, 提議的測試拓撲擴充功能將能盡量提升成效 提示

部分 OOT 測試的運作成效非常出色, 更穩定的同步處理模式

安全性考量

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

隱私權注意事項

測試 UI 堆疊無法存取私人或敏感資源,因此 沒有關於這個 RFC 的隱私權考量。

測試

我們在編寫程式碼時 進行測試

說明文件

我們打算發布開發人員指南,說明測試 UI 堆疊的使用方式。

缺點、替代方案和未知

缺點

客戶之間重複的樣板

提出的設計會留給客戶一些常用的樣板來撰寫。三 透過自訂使用者介面專屬的 實作 fuchsia.test.Suite,以便用戶端將 將用戶端和測試邏輯測試到預先定義的 UI 測試架構中。

考慮的替代方案

請參閱原始 UI 測試管理員 RFC