yii.
← Writing
Flutter 技術 · · 4 min read

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

這篇寫於 2023 年。工具和 API 變化很快,部分步驟可能已經不適用。

告訴你 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 裡可以偵測元件上的文字、tooltip、semanticLabel,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 up 和 volume 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: 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#

你知道 Maestro 嗎,兼具人性的自動化測試框架,Flutter 品質就靠它了 — Part 3: Maestro Cloud又酷又好用的 Maestro 雲端服務yii · writing

Source Code#

GitHub - chyiiiiiiiiiiii/maestro_e2e_testing_example_app: Maestro makes us write E2E testing easilyMaestro is a complete test framework that provides rich docs and APIs for developers to use. The continuous mode is…github.com


About#

Contribution#

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

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

https://www.buymeacoffee.com/yiichenhi

End#

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

本文原刊登於 Medium。