你知道 Maestro 嗎,兼具人性的自動化測試框架,Flutter 品質就靠它了 — Part 4: 結合 Gitlab CICD

Yii Chen
Flutter Formosa
Published in
9 min readApr 22, 2023

在部署 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,我這邊規劃有三個

  1. boot_simulator.sh → 啟動模擬器
  2. run_test.sh → 執行測試驗證
  3. 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

  1. 指令要測試的 flows/ 目錄
  2. 驗證每個 Flow 流程,將失敗和成功的次數記錄下來
  3. 顯示自定義的結果報告,包含總次數、失敗次數、成功次數和通過率,根據通過率檢查是否正常,一旦有測試流程失敗的情況則暫停 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

Gitlab Runner / Gitlab CICD / Simulator
Gitlab CICD

Conclusion

最終所有的測試還是必須與自動化流程結合,在 CICD 裡一開始先檢查測試,都正常才進行後續的 build 和 deploy,也因為 Maestro 需要模擬器的協助,所以需要確保你的 CICD 可以和自己準備的環境溝通。如果像 Codemagic 服務都在雲端運行的話可能就無法使用 Maestro Testing,還是要根據自己和公司的需求去決定使用哪個流程。

總而言之,Maestro 是一個很完整且穩定的第三方測試服務,我會持續關注他們的進展與更新,之後再分享給大家!

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