UI Testing for Compose

date
Apr 10, 2024
slug
ui-testing-for-compose
status
Published
tags
Programming
summary
如何幫 Jetpack Compose 寫 UI 測試。
type
Post

簡介

最近修一堂課需要找一個 Android 專案寫測試,想到最近有一個 Side Project
HushKeyboard
ricky9667Updated Apr 24, 2024
是用 Jetpack Compose 寫的,所以藉此研究一下怎麼測 Compose 的 UI。

測試你的 Jetpack Compose UI

前置設定

加入 Dependency

首先要先在 build.gradle.kts 加上這兩個 implementation:

建立 Compose Rule

接下來我們可以透過 createComposeRule() 裡面建立一個 ComposeTestRule 的 instance,到時候我們會用這個 Test Rule 來測試 Compose 的 UI:
如果你需要 Activity 相關的資訊,可以改成用 createActivityComposeRule()

設定測試 UI

最後你可以透過 setContent 設定你想要測試的 UI:

撰寫 UI 測試

ComposeTestRule 有三種類型的 Method:
  1. Finder:讓你在 Compose 的元件樹裡面選擇你想要測試的元件,例如 onNode()onNodeWithText()
  1. Action:對你選擇的元件進行操作,例如 performClick()performGesture()
  1. Assertion:檢測你選擇的元件狀態是不是你預期的,例如 assertIsEnabled()assertHasClickAction()

Finder

我們測試 UI 的第一步需要選擇我們要測的某個元件或區塊,我們會在 onNode() 裡面提供你元件的篩選條件,這個篩選條件稱為一個 Matcher。
如果你需要一次選擇多個元件,可以改成用 onAllNodes()
另外,有一些常用的 Finder 會直接跟 Matcher 合併,例如:
  • onNodeWithText("Button")onNode(hasText(”Button”))
  • onNodeWithContentDescription("Button")onNode(hasContentDescription(”Button”))

Assertion

選擇 UI 之後,我們可以針對 Finder 選取到的 UI,檢測他是否符合我們的預期。這時候用的會是 assert(),並在裡面提供一個 Matcher。另外,Assertion 同樣也會有跟 Matcher 合併的方法,像是 assertHasClickAction()assertHasContentDescription()

Action

除此之外,我們可以針對自己用 Finder 選取的 UI 做一些行為,通常都是 perform…() 類型的方法。

使用 Robolectric 提升測試速度

 

Reference


© Ricky 2023 - 2024