AltUnity Tester 入門

こちらは [自動テスト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/browser-testing) の 22日目の記事です。


## 概要

　　　<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/0cb654a9-6e44-8aec-1fb8-0fba655214d7.png">


[AltUnity Tester（AUT）](https://altom.com/testing-tools/altunitytester/?id=unity)は、[Unityゲーム用でE2EのUIテスト自動化ツール](https://forum.unity.com/threads/altunity-tester-free-ui-end-to-end-test-automation-tool-for-unity-games.897911/)です。

Unityでテストと言えば、元 Unity Test Runner の [Unity Test Framework（UTF）](https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/manual/index.html)がありますが、UTFはUnitテスト専用で、AUTはUIテスト専用のテストツールです。

本記事では、AUTを用いてUnityでUIテストの自動化がどのようにできるのかを解説していきます。


### ターゲット

本記事のターゲットは、以下の通りです。

- Unity でアプリ開発している人
- Unity で初めてテストについて知りたい人
- Unity で UIテストを自動化したい人
- Unity Test Framework との使い分けを知りたい人


### どっちのテストが良いのか

　<a href="http://wiki.genexus.jp/hwiki.aspx?%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AE%E3%83%94%E3%83%A9%E3%83%9F%E3%83%83%E3%83%89+(ROI+%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96)"><img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/f7ed46ea-ec38-1ba7-23d1-e42064d13ab8.png"></a>

一言でテストと言っても用途によって様々なテストがあります。
今回の「UIテスト」「Unitテスト」の違いですが、**テストが入るレイヤー（場所）**が異なり、対応の早さやコストも変わります。



UTFは、UTFがサポートしているNUnitに従ってC#でテストコードを書いて、クラスやメソッドなどの**プログラミングレイヤーから品質チェックを実施**します。

AUTは、AUTがサポートしているC#/Python/Javaでテストコードを書いて、Unityエディター上やiOS/Androidにビルドされたアプリなどの**ユーザーインターフェースレイヤーから品質チェックを実施**します。

この違いは、テスト範囲とテスト品質が大きく左右されます。
理想は、両方のテストをやっておくことでユーザーにほとんど不具合を出さない高度な品質管理ができるものの、時間とお金のコストが大きくなるためトレードオフとなります。**アプリが必要最低限動くこと（普通に操作してアプリがクラッシュしないなど）だけ確認したいぐらいだったらAUTだけで良い**と思います。

UTFをやりたい人は、[Zenject](https://github.com/svermeulen/Extenject)を用いることが前提になってしまいますが、[ZenjectとUTFを組み合わせたUnitテスト](https://tsgcpp.hateblo.jp/entry/2020/06/17/142700)をオススメします。


## AUT入門

　<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/1215f59c-9e0a-c350-b271-063204413917.png">


AUTの各ページは以下のリンクとなります。

- [AltUnity Tools - Test automation tools for Unity apps and games - Altom（公式）](https://altom.com/testing-tools/altunitytester/)
- [AltUnity Tester - AltUnity Tools documentation（公式）](https://altom.gitlab.io/altunity/altunitytester/tester.html)
- [AltUnity Tester - UI Test Automation | Utilities Tools（Asset Store）](https://assetstore.unity.com/packages/tools/utilities/altunity-tester-ui-test-automation-112101)


　
公式のリリースノートが見当たらず、Forum の [AltUnity Tester - free UI end-to-end test automation tool for Unity Games](https://forum.unity.com/threads/altunity-tester-free-ui-end-to-end-test-automation-tool-for-unity-games.897911/) および[Asset Store のリリースノート](https://assetstore.unity.com/packages/tools/utilities/altunity-tester-ui-test-automation-112101#releases)でリリース状況を把握できるようです。


### プラン

[公式ページ上のプラン](https://altom.com/testing-tools/altunitytester/?id=unity#pricing)を確認するとAsset StoreからインポートするOSS版は完全無料のようで、MacOS/WindowsのAUTアプリがあってそちらは €18/月（約¥2,300ぐらい） のようです。

- AltUnity Tester（Free）
    - UnityでUIテストができる
- AltUnity Inspector（€18/月）
    - Unityエディターを起動しなくてもUIテストができる
    - ビルドしたアプリの中にアクセスして操作ができテストの詳細が把握できる
    - 2営業日以内の優先サポート
- AltUnity Pro（近日リリース予定）
    - コンソールおよびWebGLゲームでテスト実行が可能に
    - テストレポートを生成する
    - クラウドサービスと統合可能に
    - 拡張サポート


プランからわかることですが、AUTはWebGLをまだサポートできていません。
また、AltUnity Inspector（AUI）の方が充実していますが、もし誰も使っていないMacPCがあれば、Unityエディター/iOS/AndroidでUIテストを自動化できるマシーンが作れるのでAUTで十分だと思います。


### Example

　<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/996898a8-65e0-b1a1-d7c2-ac84cbf80bf7.png">　<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/9cf259a0-718f-feac-1592-d26209ede34c.png">

まずは、新規プロジェクトからAUTだけをインポートし、サンプルを触りながら操作方法を把握していきます。
細かい手順は、[公式の Get Started ページ](https://altom.gitlab.io/altunity/altunitytester/pages/get-started.html)を確認しましょう。

　<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/112ecc5b-df35-4c41-f66f-36276983960c.png">　<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/7e11efa4-cb67-3483-8ae2-81a59afba714.png">

AUTの基本操作は、以下の通りです。
通常の Unity 実行では UIテストは機能せず、AUTメニューから Unity を実行する必要があります。

1. ツールバー > Window > AltUnityTester クリック
2. AUT メニューの右サイドでUIテストしたい Platform を選択
3. Play in Editor をクリックして実行
4. Run All Tests / Run Selected Tests をクリックしてテスト開始
5. 自動でテストされ結果がダイアログに表示され正常/異常の結果を AUT メニューから確認することができる


### テストコード

では、実際に AUT のテストコードを書いてみましょう。
今回は、[公式が YouTube にアップしているチュートリアル動画](https://youtu.be/-KK7CO4uoxM)を参考にしていきます。

　<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/81da5a68-2241-488b-c149-0f4909182735.gif">

まず、練習用にシーン遷移とテキストが変化する簡単なプログラムを作ってみました。
このプログラムに対して次のようなUIテストを設計しようと思います。

1. 最初の画面（Startシーン）で設置されているボタンをクリックして次の画面へ遷移することを確認
2. （Gameシーンで）カウントダウンが実行され３・２・１の後はカウントダウンのテキストが消えて代わりにメッセージが表示されることを確認

　
そして、 `Assets/Tests/Editor` のようにフォルダーを作り、右クリック/＋ボタンからメニューを開いて Create > AltUnityTester を選択してテストコードのC#ファイルを生成します。

```csharp:StartSceneTest.cs

using NUnit.Framework;

public class StartSceneTest
{
    public AltUnityDriver AltUnityDriver;

    [OneTimeSetUp]
    public void SetUp()
    {
        AltUnityDriver = new AltUnityDriver();
    }

    [SetUp]
    public void LoadLevel()
    {
        // Startシーンを起動
        AltUnityDriver.LoadScene("Start", true);
    }

    [OneTimeTearDown]
    public void TearDown()
    {
        AltUnityDriver.Stop();
    }

    [Test]
    public void TestStartButtonLoadsGameScene()
    {
        // GoButtonを見つけたらクリックする
        AltUnityDriver.FindObject(By.NAME, "GoButton").ClickEvent();
        // Mainシーンに遷移することを確認
        AltUnityDriver.WaitForCurrentSceneToBe("Game");
    }
}
```

```csharp:GameSceneTestcs
using System.Threading;
using NUnit.Framework;

public class GameSceneTest
{
    readonly string MESSAGE_SHOW = "Start !!!";
    public AltUnityDriver AltUnityDriver;

    [OneTimeSetUp]
    public void SetUp()
    {
        AltUnityDriver = new AltUnityDriver();
    }

    [SetUp]
    public void LoadLevel()
    {
        // Startシーンを起動
        AltUnityDriver.LoadScene("Game", true);
    }

    [OneTimeTearDown]
    public void TearDown()
    {
        AltUnityDriver.Stop();
    }

    [Test]
    public void Test()
    {
        //AltUnityDriver.FindObject(By.NAME, "CountDown");
        //AltUnityDriver.FindObject(By.NAME, "Message");

        Thread.Sleep(3100);
        var countDown = AltUnityDriver.FindObject(By.NAME, "CountDown").GetText();
        Assert.AreEqual(countDown, string.Empty);
        var message = AltUnityDriver.FindObject(By.NAME, "Message").GetText();
        Assert.AreEqual(message, MESSAGE_SHOW);
    }
}
```

　
　<img width="550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/2f646620-2e75-040a-66f8-78258dc4eeed.png">

　
2のカウントダウンのところがどうやってテストコードを作るのかわからなかったので、3秒後の結果だけを確認するテストコードになってしまいました笑汗
テストコードが完成し、 AUT メニューからテストコードを選択して実行してみると正常テストであることを確認しました。


### 課題

上記以外の実装方法について、[API Documentation — AltUnity Tools documentation](https://altom.gitlab.io/altunity/altunitytester/pages/commands.html) を調べながら`Assets/AltUnityTester/Examples/Test/Editor` 配下のテストコードを参考に作っていくことで早々にテストコード作りが慣れるのではないでしょうか。

ただ、今回のカウントダウンとその後に文字が表示されるなどの**後から値が変わる要素を正常か**確認するテストコードを作ることが難しかったため、単にリファレンスでそこをサポートしてくれるものを見落としているのか工夫が必要なのか、引き続き調査していろんなテストコードがさくっと書けるようにキャッチアップを続けたいと思いますー


### C#以外のテストコード

以前、古いAUTを扱ったことがありまして、その際はPythonでテストコードを作って検証していました。
もし、Pythonで作られたい方は、[MacでPythonの2.xと3.xを共存させるためにpyenvを入れた時の話し - @gremito](https://qiita.com/gremito/items/4d64b9a5c3c8744206c1) も参考になると幸いです。


## まとめ

これをきっかけに Unity で UIテストができるようになると思います。
Unity を起動し、AUTメニューからしか UIテストできないため、全テストを自動化することはできません。

ですが、それは Unity だけではできないという話で、コマンドから Unity を起動し、 [PyAutoGui](https://pypi.org/project/PyAutoGUI/) を用いて AUT メニューの操作を実行するPythonスクリプトを書くなどして自動化することができます。
また、テスト結果も同様でレポート機能がありませんが、例えばテスト結果をスクショしてSlackにアップするツールを組み合わせることで、テスト全行程を自動化することも不可能ではありません。

これを機に Unity で自動テストにチャレンジしてみてくださいー

- [PyAutoGuiで繰り返し作業をPythonにやらせよう - @hirohiro77](https://qiita.com/hirohiro77/items/78e26a59c2e45a0fe4e3)
- [【Python】PyAutoGuiの画像認識で人間の操作を自動化（RPA）する - 株式会社ライトコード](https://rightcode.co.jp/blog/information-technology/python-automate-human-operations-with-pyautogui-image-recognition)
- [【Python】pyautoguiを使ってKindle書籍を自動でスクショするツールを作ってみた！ | 都会のエレキベア](https://elekibear.com/20200225_01)