Unity の Automated QA を使ってローカルの実機でスモークテストを実行してみた

この記事は [Akatsuki Advent Calendar 2021](https://adventar.org/calendars/6566) ４日目の記事になります
前日の記事は [C言語で自作shell作ってみた(コマンド実行とリダイレクト)](https://shivashin495.hatenablog.com/entry/2021/12/03/165748?_ga=2.72882707.1476526333.1638516421-1733917448.1632573419)です

## はじめに
ゲーム業界でもテストについての話題が多くなっていますね
そんな中、今年の４月ごろに Unity が Automated QA という機能をリリースしました（まだ Preview です）
今回はその Automated QA を使ってスモークテストをローカルの実機で確認するまでを試してみました

## Automated QA とは
Automated QA は Unity エディタで UI へのタップやスワイプ、ドラッグなどを記録し、エディタや iOS、 Android で再生を行うことでテストができる機能です
毎回検証が必要な箇所を記録することで以降は自動で検証ができるようになったりします
また、複数の記録を組み合わせてテストを作成するコンポジット機能などがあり、テストを柔軟に作り上げることも可能です
より具体的な機能は[公式のブログ](https://blog.unity.com/ja/games/on-demand-qa-testing-with-unity-automated-qa)や[公式のドキュメント](https://docs.unity3d.com/Packages/com.unity.automated-testing@0.8/manual/index.html)をご覧ください

## 環境
今回の環境は以下になります
MacOS BigSur
Unity 2020.3.1f1
Automated QA 0.8.0-preview.1 
iPhone Xs Max

## Automated QA の導入
Automated QA の導入は簡単です
Unity の PackageManager を起動して「+」を押下し「Add package from git URL...」を選択
![スクリーンショット 2021-12-04 11.50.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/b853f44c-a425-3494-1b86-8ec555542e46.png)

入力欄が表示されるので、そこに「com.unity.automated-testing」と入力し「Add」を押下
![スクリーンショット 2021-12-04 11.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/59412f59-fc81-a725-8ab8-6cde66c50a9e.png)

これで導入は完了です

## Automated QA で記録を行う
Automated QA の Window はメニューの「Automated QA」から表示できます
![スクリーンショット 2021-12-04 15.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/58a0d828-3083-6184-2109-c25a50fbbfa4.png)

「Recorded Playback」から「Record」を選択するとゲームが再生されます
記録したい操作を行い、完了したら「Stop」を押下すると Json ファイルが作成され Recordings フォルダに保存されます
この Json ファイルは以下のような内容になります
![スクリーンショット 2021-12-04 20.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/b944a922-e740-b95a-bc6b-eda841955f48.png)
GameObject の名前や付けられているタグの名前、ヒエラルキーなど様々な情報が書かれていますね

## Automated QA を使ってテストを行う
作成した Json を使って C# のテストコードを作成することができます
「Automated QA Hub」Window から「Test Generation」を押下し Recordings から C# コード化したい記録を選択し 「Full Tests」を実行します
![スクリーンショット 2021-12-04 16.36.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/ceb97d92-fd81-6a39-25f6-0a41eb2fddf9.png)

生成された C# コードは「GeneratedTests」フォルダの中に保存されます
これは「Test Runner」から実行できる C# コードです

![スクリーンショット 2021-12-04 16.38.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/0f238100-e91a-69ea-4530-f6b46a5def4c.png)
C# コードを生成した後は「Test Runner」の「PlayMode」をエディタで実行して、実行できるか確認してください
次はプラットフォームへビルドしてテストを行うため、事前にビルドの設定をします
Unity のターゲットとなるプラットフォームの指定で iOS を設定した場合は、ビルド後に Xcode のビルドを行うため、事前に Xcode プロジェクトの設定を行う必要があります(PostProcessBuildからの設定でも問題ないと思います)
![スクリーンショット 2021-12-04 17.50.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/552c6f15-6de5-3efc-69ec-7396d0e68e66.png)
この設定が終わったら iPhone を接続して「Test Runner」にある「Run All Tests」or「Run Selected Tests」を実行します
![スクリーンショット 2021-12-04 18.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/fa139bd3-60b1-432b-4be0-294deabff8c6.png)

ここまで実行ができれば前準備は完了です！！

## Command Line から テストを実行する
ここからは　Command Line でテストを実行していきます

```sh
# プロジェクトへのパスやオプションは適宜変更してください
/Applications/Unity/Hub/Editor/2020.3.1f1/Unity.app/Contents/MacOS/Unity -runTests -batchmode -projectPath TestAutomatedQA/ -testPlatform iOS -testResults ./result.xml -logFile
```

今までテストが問題なく動作していたらこれで Command Line から実行ができます
![RPReplay_Final.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/87f2a73e-61c7-e913-72f6-7cd0a69031b6.gif)

出力した `result.xml` は以下のような内容で出力されます
![スクリーンショット 2021-12-04 19.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153196/a5b21642-5e87-adb6-1980-c599d0e09a51.png)

## まとめ
Command Line から Automated QA を利用した実機でのスモークテストを行ってみました
起動はできるのか・エラーが起きることなく全ての画面へ遷移が行えるのかなどの簡易なチェックを行いたい場合に Unity の機能で完結できるのは便利ですね

C# コード化することで Test Runner から実行できるようになり、UI の操作もスクリプトで操作できるようにもなりました
また、[ElementQuery](https://docs.unity3d.com/Packages/com.unity.automated-testing@0.8/manual/Driver.html) という機能を利用することでより柔軟な GameObject の検索ができるようになるので追って記事を書きたいと思っています

Automated QA の今後の展望として将来的には ML-Agents を用いて AI による自動操作も可能にする予定とのことなのでさらに便利になっていることを楽しみにしていましょう