你知道 Maestro 嗎,兼具人性的自動化測試框架,Flutter 品質就靠它了 — Part 2: 指令與操作

Yii Chen
Flutter Formosa
Published in
10 min readFeb 6, 2023

告訴你 Maestro 有支援哪些指令

Maestro 是一個 End-to-End 測試的解決方案,即使不是開發人員也可以很容易地編寫測試細節。本文是系列文章的第二篇,主要解說 Maestro 提供了哪些好用的操作指令,簡單易懂,你應該花一點時間就能上手了,趕快往下看看吧!

如果好奇有關 Maestro 的其他文章,可以點下方連結跳轉:

通用屬性

  • text → 文字內容
  • id → 指定 ID 的元件
  • index → 第幾個元件,從0開始,適用於有多個相同內容的元件時
  • width → 指定寬度的元件
  • height → 指定高度的元件
  • tolerance → 指定寬度與高度的公差
  • enabled → 有 enabled 狀態的元件
  • optional → 不一定找得到元件,如果找不到測試也不會失敗
  • below → 指定以下的元件
  • above → 指定以上的元件
  • leftOf → 指定左邊的元件
  • rightOf → 指定右邊的元件
  • containsChild → 包含有某些文字的元件
  • point → 指定 XY 位置的元件

提醒:Flutter 裡可以偵測元件上的文字tooltipsemanticLabel,semanticLabel 優先於 tooltip,而 Key 目前無法使用

tapOn 點擊

  • 通用屬性
// 1.
- tapOn: "login"

// 2.
- tapOn: "btnPurchase"

longPressOn 長按

  • 通用屬性

inputText 輸入文字

目前不支援輸入 Unicode 表情符號

inputText: "Hello"

inputRandomEmail 輸入隨機Email

inputRandomPersonName 輸入隨機人名

inputRandomNumber 輸入隨機數字

  • length → 指定長度

inputRandomText 輸入隨機文字

- inputRandomEmail
- inputRandomNumber:
length: 20

eraseText 清除文字

預設最多刪除 50 個長度,也可以指定數量

- eraseText

- eraseText: 100

copyTextFrom 複製文字

  • 通用屬性
- copyTextFrom:
id: "aTextField"

pasteText 貼上文字

- pasteText
- copyTextFrom:
id: "aTextField"
- tapOn:
id: "bTextField"
- pasteText

scroll 直向滾動

swipe 滑動

  • direction → 設置方向,LEFT、RIGHT、UP、DOWN
  • start → XY位置
  • end → XY位置
  • duration → 速度,單位為毫秒,預設為 2 秒
- swipe:
direction: TOP

- swipe:
start: 200, 200
end: 300, 300

- swipe:
direction: RIGHT
duration: 300

repeat 重複操作

重複執行某一組命令

- repeat:
times: 5
commands:
- tapOn: 'Increment'
- scroll

hideKeyboard 隱藏鍵盤

pressKey 特殊操作

  • home → 返回桌面
  • lock → 鎖定螢幕
  • enter → 點擊 Enter
  • backspace → 點擊 Backspace
  • volume upvolume down → 控制音量
  • back → 後退按鈕 (僅支援 Android)
- pressKey: backspace

back 返回上一頁

目前只有 Android 支援

- back

assertVisible 檢查文字顯示

如果元件還沒有顯示,會等到出現才繼續

assertNotVisible 檢查文字沒顯示

如果元件有顯示,會等到消失才繼續

assertTrue 檢查變數是否為 true

extendedWaitUntil 等待元件顯示

正常來說不太建議手動執行等待操作,通常 5~10 秒的時間可以使用 assert 操作

  • visible → 可見
  • notVisible → 不可見
  • timeout → 超時(ms)
- extendedWaitUntil:
visible: "Success"
timeout: 10000

waitForAnimationToEnd 等待動態結束

等待進行的動畫和影片完成,並且螢幕回到靜止的狀態

  • timeout → 超時,時間到了之後會被標記為成功,然後繼續後面的流程
- waitForAnimationToEnd

- waitForAnimationToEnd
timeout: 7000

takeScreenshot 螢幕截圖

- takeScreenshot: TempScreen #generate a TempScreen.png

openLink 開啟連結

- openLink: https://maestro.mobile.dev/

creatState 刪除資料與狀態

# 清除當前 APP 狀態
- creatState

# 清除指定 APP 的狀態
- creatState: com.yii.example

clearKeychain 清除金鑰

刪除 iOS Keychain,不支援 Androids

- clearKeyChain

launchApp 啟動APP

  • appId → 應用ID
  • clearState → 是否清除資料
  • clearKeychain → 是否清除金鑰
  • stopApp → 運行前先將 APP 停止,預設為 true
- launchApp: com.yii.example

- launchApp:
appId: com.yii.example
clearState: true

stopApp 停止APP

- stopApp

- stopApp: com.yii.example

Conditions 條件判斷

通常不建議在測試裡面加入條件判斷,會讓整個流程的複雜性和可讀性增加

  • visible
  • notVisible
  • true
- runFlow:
when:
notVisible: "Create Post"
file: Login.yaml

Secret Variables 機密資訊

在某些情境下可能不會直接將有安全疑慮的資料寫在測試檔案裡,這時可以透過在指令上設置 variable,讓我們驗證測試時可以存取

  • 新增 -e NAME=XXX 添加變數,讓測試時可以存取變數而不寫死
maestro cloud -e PASSWORD=$TEST_PASSWORD app.apk .flows/

test.yaml

appId: com.example.cicdtest02
---
- launchApp
- inputText: ${PASSWORD}

Inline Variables

添加 env 設置自定義的變數

appId: com.yii.example
env:
SECRET: 123

---

- inputText: ${SECRET}

傳送變數給接下來運行的 Flow

appId: com.yii.example

---

- runFlow:
file: subflow.yaml
env:
SECRET: 123

嵌套組合流程

通常在一些情境的過程可能會需要相同的操作,我們可以將重複的操作流程撰寫成獨立的 yaml 檔,讓每個流程在測試時都能輕鬆加入這個操作,避免重複撰寫相同指令

- runFlow: Login.yaml

如果在許多情境下都需要使用者先登入的話,就將登入寫成 Login.yaml,接著讓需要的流程去引用它,簡單完成前置操作

Login.yaml

appId: com.yii.example

- launchApp
- tapOn: "Login"

Create Post.yaml

appId: com.yii.example

- runFlow: Login.yaml
- assertVisible: "Create"
- tapOn: "Create"
- assertVisible: "Create Post" # Title of TopBar

Conclusion

Maestro 除了常見操作以外,還支援很多進階操作,像是開啟連結、條件判斷,甚至是組合流程,都能夠讓我們驗證更多情境,測試靈活性很高。如果有什麼 Maestro 指令的心得也能夠在社群或是官方 Slack 分享,其他人都會給予幫助,感覺很不錯。

本系列的其他章節會說明更詳細的資訊,以及如何用它來幫助專案,有時間的話快去看看吧!

Next

Source Code

About

Contribution

謝謝你花費時間看完,非常感謝!

如果覺得文章不錯的話可以贊助,讓我有更多動力和熱情分享學習紀錄和生活!請我喝一杯咖啡吧~

https://www.buymeacoffee.com/yiichenhi

End

希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章~

--

--

Yii Chen
Flutter Formosa

Flutter Lover || Organizer FlutterTaipei || Writer, Speaker || wanna make Flutter strong in Taiwan. https://linktr.ee/yiichenhi