你知道 Maestro 嗎,兼具人性的自動化測試框架,Flutter 品質就靠它了 — Part 4: 結合 Gitlab CICD
在部署 APP 之前多一層防護吧
Maestro 是一個 End-to-End 測試的解決方案,即使不是開發人員也可以很容易地編寫測試細節。在本文範例中,我將 Maestro 測試添加到 Gitlab CICD 中,協助檢查 Flutter 應用,過程會透過腳本啟動本地模擬器、執行多流程驗證並顯示報告、最後關閉模擬器,接著建置 App 安裝檔,然後將它部署到 App Center,讓開發者與 QA 人員可以在手機上操作。
如果好奇有關 Maestro 的其他文章,可以點下方連結跳轉:
首先我們先看 Maestro Test 整合到 Gitlab CI 的樣子,期望除了有 Flutter Test 驗證之外還要多一層防護罩,就是跑使用者流程的操作測試,確認都沒問題後再進行後續的 build 和 deploy,而一但發現有錯誤的話則停止動作,通知負責人員。
實際就是讓 Gitlab runner 在機器上跑的時候可以主動啟動模擬器,接著開始進行測試驗證,當然如果你的 CICD 環境是在雲端的話可能就沒辦法使用 Maestro 了,除非是官方的 Maestro Cloud,很方便很好用,但是跑一個 flow 需要 0.1 美元,結果就是會花很多錢,對我們來說應該不是個很好的選擇。
Executor
Maestro CI 需要的 Shell Script,我這邊規劃有三個
boot_simulator.sh
→ 啟動模擬器run_test.sh
→ 執行測試驗證shutdown_simulator.sh
→ 關閉模擬器
boot_simulator.sh
裡面其實很簡單,就是透過 idb 幫我們開啟模擬器,準備待會跑測試。裡面的參數為 Simulator Deivce ID
#!/bin/sh
# idb_companion --boot <id of the iOS device>
# excute 'xcrun simctl list' in terminal to check device list.
idb_companion --boot $1
run_test.sh
- 指令要測試的
flows/
目錄 - 驗證每個 Flow 流程,將失敗和成功的次數記錄下來
- 顯示自定義的結果報告,包含總次數、失敗次數、成功次數和通過率,根據通過率檢查是否正常,一旦有測試流程失敗的情況則暫停 CICD
#!/bin/sh
directory=../maestro/flows/
successedCount=0
failedCount=0
for entry in "$directory"*
do
number=$(caculate $successedCount+$failedCount+1)
echo "---------------------- Flow $number ------------------------"
log=$(maestro test "$entry")
if [[ $log == *"FAILED"* ]]; then
let failedCount=failedCount+1
continue
fi
let successedCount=successedCount+1
done
echo "------------------------------------------------"
echo
totalCount="$(($successedCount+$failedCount))"
echo "Total: $totalCount"
echo "Success: $successedCount"
echo "Failure: $failedCount"
percent=$(caculate $successedCount/$totalCount*100)
percent=${percent%.*}
echo "Pass: $successedCount/$totalCount, $percent%"
echo
goodEmoji='\xE2\x9C\x85'
badEmoji='\xE2\x9D\x8C'
if [ "$percent" = "100" ]
then
echo $goodEmoji$goodEmoji$goodEmoji
else
echo $badEmoji
fi
echo
if [[ $percent == *"100"* ]]; then
echo "Maestro tests passed!"
else
echo "Maestro tests failed."
echo
exit 1
fi
echo
shutdown_simulator.sh
顧名思義,就是關閉模擬器,節省機器的資源
#!/bin/sh
idb_companion --shutdown $1
Usage
首先取得模擬器的設備資訊,記好要跑測試的 Device ID,Android 或 iOS 設備都可以
xcrun simctl list
啟動模擬器
- 參數為要測試的 Device ID
./boot_simulator.sh F7CABB3C-DD6F-432D-A86F-5884287D2261
運行測試
./run_test.sh
關閉模擬器
./shutdown_simulator.sh F7CABB3C-DD6F-432D-A86F-5884287D2261
Demo
Conclusion
最終所有的測試還是必須與自動化流程結合,在 CICD 裡一開始先檢查測試,都正常才進行後續的 build 和 deploy,也因為 Maestro 需要模擬器的協助,所以需要確保你的 CICD 可以和自己準備的環境溝通。如果像 Codemagic 服務都在雲端運行的話可能就無法使用 Maestro Testing,還是要根據自己和公司的需求去決定使用哪個流程。
總而言之,Maestro 是一個很完整且穩定的第三方測試服務,我會持續關注他們的進展與更新,之後再分享給大家!
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
希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章~