MagicPodのUIテストをGitHub Actionsで自動化してみた

# 投稿の経緯
頭痛ーるのUIテストにMagicpodを導入することになり、テストをGitHub Actionsで自動化したので記事にします。


# MagicPodとは
Webアプリ・モバイルアプリの両方に対応しているクラウド型のUIテスト自動化ツールです。
MagicPodのテストはプログラミングの知識がなくてもノーコード・ローコードで構築できます。

直感的にテストケースを作成できるのでぜひ一度触ってみてください。

https://magicpod.com/


# 前提
・Fastlaneはすでに導入ずみ
・GitHub Actionsはすでに導入ずみ
・MagicPodも導入ずみ（テストケースも作成ずみ）


# Simulator用にビルドされたアプリを作成する
MagicpodではSimulator用にビルドされたアプリが必要なのでFastlane stepで作成します。

```
desc "xcodebuild for simulator"
lane :preparation_magicpod_test do
  app_dir_path = "./magicpod_test"

  build_ios_app(
    scheme: "xxxxx",
    workspace: yyyyy.xcodeproj,
    configuration: "Debug",
    export_method: "ad-hoc",
    derived_data_path: app_dir_path,
    skip_package_ipa: true,
    skip_archive: true,
    destination: "generic/platform=iOS Simulator"
  )
end
```

lane：任意の名前を設定します（今回はpreparation_magicpod_test）
app_dir_path：Simulator用にビルドされたアプリを保管するディレクトリを指定
scheme：ビルドするアプリのscheme
workspace：ビルドするアプリファイルを指定（Cocoapodsを使っているので.xcodeproj）

その他設定項目はFastlaneのドキュメントを参考にしてもらえればいいと思います。

https://docs.fastlane.tools/actions/build_ios_app/

ここまで書いたら

```
$ bundle exec fastlane preparation_magicpod_test
```

を実行して`./magicpod_test`にビルドされたアプリが作成されているか確認しましょう。


# ビルドされたアプリをMagicPodにアップデートする
先ほどビルドしたアプリをMagicPodにアップロードするためのシェルスクリプトを書きます。
今回はrun_magicpod_test.shというファイルです。

```run_magicpod_test.sh
#!/bin/bash


# magicpod-api-clientのバージョンを指定して現在のディレクトリにダウンロード
RELEASE_VERSION=0.99.24.1
OS=mac
curl -L -O https://github.com/Magic-Pod/magicpod-api-client/releases/download/${RELEASE_VERSION}/${OS}64_magicpod-api-client.zip


# magicpod-api-clientを解凍
unzip -f ${OS}64_magicpod-api-client.zip


# MagicPodで使う各種環境変数を設定（MAGICPOD_API_TOKENは別で定義）
export MAGICPOD_ORGANIZATION=MagicPodで設定したOrganization名
export MAGICPOD_PROJECT=MagicPodで設定したプロジェクト名


# 先ほど作成したappファイルをMagicPodにアップロードして、FILE_NOを取得
APP_PATH=magicpod_test/Build/Products/Debug-iphonesimulator/アプリ名.app
FILE_NO=$(./magicpod-api-client upload-app -a ${APP_PATH})


# 先ほどアップロードしたアプリと、設定番号の設定を使ってテスト一括実行
./magicpod-api-client batch-run -S 1 -s "{\"app_file_number\":\"${FILE_NO}\"}"


# テストが成功した場合はアップロードしたアプリは削除
if [ $? = 0 ]; then

  ./magicpod-api-client delete-app -a ${FILE_NO}

fi
```

ここまでかけたら

```
$ bash run_magicpod_test.sh       
```

を実行して設定番号で指定したMagicPodの一括テストが実行されているか確認しましょう。

↓参考記事

https://support.magic-pod.com/hc/ja/articles/4408903744409-%E4%B8%80%E6%8B%AC%E3%83%86%E3%82%B9%E3%83%88%E5%AE%9F%E8%A1%8C-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%AE%9F%E8%A1%8C

https://support.magic-pod.com/hc/ja/articles/4408910495897-CircleCI%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA


# GitHub Actionsで動かす
MagicPodの一括テストが動作したなら次はGitHub Actionsで自動化しましょう。

実行するタイミングは任意ですが頭痛ーるではプルリクエストをmainにマージしたタイミングと,
App Store Connectにアップロードするタイミングで実行しています。

```.yaml
- name: Preparation MagicPod Test
  run: bundle exec fastlane preparation_magicpod_test
- name: Start MagicPod Test
  env:
    MAGICPOD_API_TOKEN: ${{ secrets.カギの名前 }}
  run: bash run_magicpod_test.sh
```

MAGICPOD_API_TOKENは秘密鍵なのでGitHubのSecretで定義しており

```.yaml
env:
  MAGICPOD_API_TOKEN: ${{ secrets.カギの名前 }}
```

の部分で取り出しています。

これでMagicPodのテストがCI/CDで実行されると思います。


# おわりに
これまでがっつりFastlaneとGitHub Actionsを触ったことがなかったのでいい経験になりました。
それぞれどういう記述が必要で、何をしているかの全体像はかなり掴めたかなと思っています。

MagicPodを導入したことで、頭痛ーるアプリのデバッグコストが軽減されることに期待しています。

最後までご覧いただきありがとうございました！