你知道 Maestro 嗎,兼具人性的自動化測試框架,Flutter 品質就靠它了 — Part 2: 指令與操作
告訴你 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 條件判斷
通常不建議在測試裡面加入條件判斷,會讓整個流程的複雜性和可讀性增加
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
- 學會運用 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
希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章~