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

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

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

在部署 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 Runner / Gitlab CICD / Simulator
Gitlab CICD
Gitlab CICD

Conclusion#

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

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

Source Code#

GitHub - chyiiiiiiiiiiii/maestro_gitlab_cicd_for_flutter: Maestro is a good option for E2E testing…Maestro is a good solution for E2E testing that is very easy to write test details even if not a developer. I use it in…github.com


About#

Contribution#

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

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

https://www.buymeacoffee.com/yiichenhi

End#

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

本文原刊登於 Medium。