最短でAirTestでUIテストをしてSlackに定期的に結果を通知する方法！

https://qiita.com/advent-calendar/2022/sumzap

今年も始まりましたAdventCalendar！
この記事はサムザップ Advent Calendar 2022 12/1の記事です！

ここでは手軽に出来る最小の自動テストの環境構築方法を記事にしました。
「とりあえず自動テスト環境を作ってみて試したい！」といった方に読んでいただきたいです。

**UnityエディタとAirTestで自動テストを動かしている様子**

<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/36cddaea-caec-3626-0f37-9dfd98ca2946.png">

# 本記事で扱うこと

**最短最小構成で「毎日同じ時間に自動テストを走らせて、結果をSlackに共有する」** を目標に、本記事では環境を構築していきます。使用ソフトとしては、主に以下のものになります。

**・AirTest
・Slack
・Unity
・タイムスケジューラー**

今回はUnityを使用していますが、AirTestに対応したものであれば別のものでも適応が可能となっております。
また、Windowでの実行を前提としていますがMacでも動作が出来るように該当箇所では補足を記載しています。

# 本記事で扱わないこと

本記事ではAirTestを使った自動テストの環境構築を解説するため、実際の**AirTestの使い方やPythonコードの書き方は扱いません。**
しかし、これらの情報はQiitaのみならず本やブログなどですでに多くの解説があります。詳しく知りたい方はそちらを参考にしてもらえればと思います。

https://qiita.com/Nitudon/items/0c5c527841388fec22ed

# 作成するテスト環境

改めて **「毎日同じ時間に自動テストを走らせて、結果をSlackに共有する」** を目標にテスト環境を作っていきます。

この環境には大きく分けて3つの機能が必要です。
**「アプリに対して自動テストを行う機能」**
**「自動テストの結果をSlackに共有する機能」**
**「毎日同じ時間に処理を実行する機能」**

それではこの機能を一つずつ作成していきましょう。



## アプリに対して自動テストを行う機能

この機能は **AirTest** と **PocoSDK** を使って作成をします。
AirTestとはEetEase社が開発をしているUIテストツールです。
AirTest単体でも画像認識などを使ったUIのテストができますが、PocoSDKを使うことでより強力なテストを実施ができます。

まずはAirTestIDEとPocoSDKの導入方法を解説します。



### AirTestIDEの導入

AirTestには専用のIDEが用意されています。

１）AirTestのサイトに以下のURLからアクセス

https://airtest.netease.com/

２）以下のボタンをクリックし、IDEをダウンロードします

![AirTestIED_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/4b4c247b-cb7c-9331-560f-9fcc9a0e4265.png)

３）解凍後、[AirtestIDE]を起動します。
サインインを求められるポップアップが出ますが、[Skip]を押して問題ありません。

![AirTest_Sign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/bcb5fab1-272d-320a-3905-1c5951d98bda.png)

これでAirTestの導入は完了です。

### PocoSDKの導入

１）POCOのSDKを以下のURLから取得

https://github.com/AirtestProject/Poco-SDK

２）Unityプロジェクトの作成をします。今回はサンプルとしてUnityの[Runner Game]テンプレートを使用し、使用するUnityバージョンは2021.3.6f１となります。

UnityHubから[Runner Game]を選択し、プロジェクトを作成をクリック。

![Unity_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/6a7700cc-16ed-c560-f499-d43dbd9ecf3c.png)

３）SDKからUnity3Dフォルダー以下を作成したUnityにコピーし、今回使用しない[ngui]、[fairygui]、[uguiWithTMPro]フォルダーを削除。
[3rdLib]フォルダー内の[Newtonsoft.Json.dll]を削除。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/58b225c1-8641-8055-85f9-a5561615d2a4.png)

４）[PocoManager.cs]をメインカメラにアタッチ

これでPOCOの導入が完了しました。

それではUnityのビルドをして実行ファイルを生成しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/d57f9f55-afbb-1024-d1f7-d7b16fe31146.png)

５）[File]から[Build Setting]をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/c6496d0c-e724-f0a0-e00a-596c7bc147ec.png)

６）設定を確認し、[build]をクリックします。保存先を聞かれるので、指定をするとビルドが始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/5c72ae03-106e-e2b5-838a-fad64b2f73a2.png)

これで作成したビルドはAirTestとPocoの環境で使用できるようになりました。

### AirTestとPocoの使い方について

AirTest自体の使い方についてはすでに素晴らしいページがいくつもあるため割愛をさせていただきますが、参考となるページを記載しておきます。
実際のテスト用のコードを書く際はこちらを参考に記載していくと良いでしょう。

https://qiita.com/Nitudon/items/0c5c527841388fec22ed

https://www.amazon.co.jp/Unity-Airtest-%E8%87%AA%E5%8B%95%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%89%8B%E5%BC%95%E3%81%8D-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E4%BD%8F%E7%94%B0-ebook/dp/B09Y19T8VP


## テストの結果をSlackに送る

次は「テストの結果をSlackに送る」機能です。

今回のようにSlack上に通知を飛ばすなら **SlackBot** を使う簡単にできます。
SlackBotを使えばAirTestに記載したPythonのコードから以下のような投稿を行うことが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/fbd02152-4eed-bf9b-6287-21341703c89c.png)

ここではSlackBotの設定方法とAirTest上のPythonを使って、Slackへメッセージを送る方法を解説します。

### SlackBotの作成

テストの結果をSlackに通知するため、SlackBotを作成します。
Slackのアカウントとうがまだない場合は[こちらから](https://news.mynavi.jp/article/20220131-2249894/)作成をしてください。(アイコン設定とうは不要です。無料のアカウント作成までで大丈夫です。)

１）以下のSlackのページにアクセスしてください

https://api.slack.com/apps

２）[Create an App]をクリック

![Slack_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/9ae4db8e-c051-a249-f51f-d6b72a60ffb5.png)

３）ポップアップが出てくるので、[AppName]にボット名を、[Pick A wokspace to develop your app]に使用するワークスペース名を入れてください。(ワークスペース名が出てこない場合は[こちらを参考](https://slack.com/intl/ja-jp/help/articles/206845317-Slack-%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)にSlackのワークスペースを作成してください)

![Slack_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/51126601-8acd-3833-e750-306d9feed4e9.png)

４）[OAuth & Permissions]を選択

![Slack_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/f78c6b87-2a8c-6e91-d968-867472ec3a73.png)

５）ページ下部のScopesの[Add an OAuthScope]をクリックし[chat:write]と[chat:write.customize]を追加します

![Slack_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/5f77b756-d1cf-aa62-649e-6cb81a1c9686.png)

６）[Install App]から[Install to Workspace]をクリック

![Slack_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/54729b58-8f87-fc01-7dac-01b3db41d550.png)

７）[許可する]をクリック

![Slack_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/9129aa37-52d8-d3af-6ba7-53627b9b624e.png)

８）Slackのト－クン確認
(後の項目でトークンを使用するため、コピーやメモをしておくとスムーズです)

![Slack_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/948a66e2-73ef-4749-88c7-8820e72d1ec3.png)

９）Slack上でボットを使用するチャンネルを右クリックし、出てきたウィンドウから[チャンネル詳細を表示する]をくりっく

![Slack_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/bec8a36e-c0df-d7d2-2ba8-0c2252bedc2c.png)

１０）[インテグレーション]の[App]にある[アプリを追加する]をクリック

![Slack_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/0e960f30-d15b-ee79-7f08-d2f4cab6fe05.png)

１１）先ほど[AppName]で設定したボット名があるはずなので、追加

![Slack_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/04e3f082-b6d6-27dd-dddd-a69e024542ac.png)

これでSlackBotの追加は完了です。

### AirTestで通信の確認

それでは実際に動かして確認をしてみましょう。
AirTestで新しいファイルを作成し、下記のコードを実行して動作の確認をしてみてください。
（TOKENのところには先ほどのトークンをコピー&ペーストしてください）

```
import requests

TOKEN = 'ここにTOKENを入れてください'
CHANNEL = 'airtest'

url = "https://slack.com/api/chat.postMessage"

headers = {"Authorization": "Bearer "+TOKEN}
data  = {
   'channel': CHANNEL,
   'text': '通信テスト！'
}
r = requests.post(url, headers=headers, data=data)
print("return ", r.json())
```

以下のようなチャットが投稿されれば無事に設定完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/fbd02152-4eed-bf9b-6287-21341703c89c.png)

これでAirTestのPythonからSlackに通知を飛ばすことができました。
あとはテスト内容に応じて上記のtextの部分に必要な情報を追って記載すれば問題ないでしょう。


## 毎日同じ時間に処理を実行する機能

それでは最後の機能ですが、Windowsであれば定期実行のために **タスクスケジューラー** という機能があります。
この機能はWindowsには最初から付いており、実行ファイルを指定の時間に起動できます。
今回作成したAirTestのPythonの実行ファイルも例外ではありませんので、この機能を使いましょう。
（タスクスケジューラーはWindowsの機能のため、Macにはありません。Macの方は別の方法がありますので、[こちらの記事](https://selfs-ryo.com/detail/automatic_execution_on_mac)を参考にしてみてください。）

１）タスクスケジューラーを起動し、タスクの作成をクリックします。

![Task_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/b3dc0061-90a5-56b4-9f9b-fe276539dc24.png)

２）タスクの作成ウィンドウで名前を設定します。ここでは[AirTest]としました。

![Task_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/f0b99d71-be4b-593b-28fa-fa2cf9eac522.png)

３）操作タブに移動し、[新規]をクリックします。

![Task_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/38dcecdf-abe3-99c0-944f-5d2a21faa1c1.png)

４）[プログラム/スクリプト]の部分で今回AirTestで作成をしたPythonを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/327dea9a-fc2d-721b-8194-ad99ad483773.png)

５）トリガータブに移動し、[新規]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/8fa80ff6-218b-6c2c-ee7b-596afee59714.png)

６）実施のスケジュールを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/541cdb7d-e317-e234-14f3-3abeb59c838a.png)

これで設定した時間にAirTestが実行されるようになりました。

## 構築環境の実行

それでは実際にタスクスケジューラーから自動テストを実行してみましょう。
タスクスケジューラーで直近の時刻を設定し確認をしてみてください。
問題なく実行され、Slackに通知が飛んでいれば成功です！


# 今後の環境の拡張について

今回紹介したテスト環境はいかがだったでしょうか？
最小の機能しかないため、実際に扱うとなると足りない機能があったかもしれません。

例えばUnityのビルドはAirTestを行う前に自動で最新の状態をビルドしてくれたらとても楽になるかと思います。

今回は最小構成であることと構築難易度を下げることからJenkinsを用いませんでしたが、こういった機能はJenkinsや他のSlack API、GithubActionsを用いると実装できます。

ここでは紹介だけにとどめますが、Jenkinsとの連携方法はさまざまな資料があるため、ぜひご自身の環境にあった構築を模索してみてください。

### 毎晩の自動で最新ビルドに対してAirTestを実行したい

Jenkinsを用いて、毎晩決まったブランチをビルドすることが可能です。
UnityもPythonもJenkinsからコマンドをたたくことでUnityのビルド、AirTestの実行といったことをスケジュールに合わせて行うことができます

### プッシュしたら自動テストを実行したい

GithubActionを使うことでプッシュをした際に自動ビルドをすることも可能です。
ただ、GithubActionsだけでは今回の自動テストの実行は難しいため、ビルドだけ行ってテストはJenkinsでコマンドをたたいて実行する必要が出てくるでしょう。

### Jenkinsを用いた弊社のAirTest活用例について

弊社でのAirTestの活用についてをCEDEC 2020で登壇しております。
こちらも確認していただくと実際の活用例が分かるかと思います。

https://speakerdeck.com/sgeengineer/airtesttopocotoopenstfniyoruunityzhi-sumatohuonxiang-kegemufalseshi-ji-zi-dong-tesutohuan-jing-gou-zhu-tosofalseli-yong-fang-fa

# 終わりに
今回は最短でできる自動テストの環境構築について書かせていただきました。

この記事が皆様のテスト環境導入の第一歩になればと思います。

明日は@shiimanさんの[「S3ストレージクラス変更時の注意点」](https://shiimanblog.com/engineering/change_class_s3/)です。