你知道 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、DOWNstart→ 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→ 點擊 Enterbackspace→ 點擊 Backspacevolume 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 開啟連結#
- openLink: https://maestro.mobile.dev/
creatState 刪除資料與狀態#
# 清除當前 APP 狀態
- creatState
# 清除指定 APP 的狀態
- creatState: com.yii.example
clearKeychain 清除金鑰#
刪除 iOS Keychain,不支援 Androids
- clearKeyChain
launchApp 啟動APP#
appId→ 應用IDclearState→ 是否清除資料clearKeychain→ 是否清除金鑰stopApp→ 運行前先將 APP 停止,預設為 true
- launchApp: com.yii.example
- launchApp:
appId: com.yii.example
clearState: true
stopApp 停止APP#
- stopApp
- stopApp: com.yii.example
Conditions 條件判斷#
通常不建議在測試裡面加入條件判斷,會讓整個流程的複雜性和可讀性增加
visiblenotVisibletrue
- 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#
- 學會運用 Flutter Widgetbook,該管好自己和公司的元件庫了!
- 剛進入 Flutter 嗎?適合初學者食用,GetX 是否適合你呢!
- 教你為 Riverpod 2.0 撰寫 Flutter 測試 part.1
- 教你為 Riverpod 2.0 撰寫 Flutter 測試 part.2
- 輕鬆了解 Isar NoSQL DB,用它來實作 Flutter 資料庫吧!
- Flutter 輕鬆實作 i18n,使用 easy_localization_generator 就對了
- Flutter CICD 使用 Gitlab Runner 和 App Center 實作 part.1
- Flutter CICD 使用 Gitlab Runner 和 App Center 實作 part.2
- 使用 CodeMagic 和 Firebase 實現 Flutter CICD
- 輕鬆完成Flutter開發環境,最新版!
- 實作Flutter多變有趣的滾動效果CustomScrollView!
- 如何在Flutter使用 Makefile 節省你的時間?
- Easily understand StatefulWidget LifeCycle of Flutter
- “freezed” makes model class strong and easily
- 提高Flutter性能的小技巧!(一)
- 提高Flutter性能的小技巧!(二)
- 提高Flutter性能的小技巧!(三)
- What are Async and Isolates in Flutter?
- LoadBalancer is optimization for Isolates in Flutter
- Riverpod 輕鬆學,原來這麼好用!
- Riverpod 輕鬆學(二),一些進階用法!
About#
- GitHub: chyiiiiiiiiiiii
- Instagram: flutterluvr.yii
- Linkedin: yiichenhi
- Youtube: Yii
- Youtube: 一起饅頭(美食頻道)
- Email: ab20803@gmail.com
Contribution#
謝謝你花費時間看完,非常感謝!
如果覺得文章不錯的話可以贊助,讓我有更多動力和熱情分享學習紀錄和生活!請我喝一杯咖啡吧~
End#
希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章~
本文原刊登於 Medium。