AltUnity Tester 入門


こちらは 自動テスト Advent Calendar 2020 の 22日目の記事です。

概要

   

AltUnity Tester(AUT)は、Unityゲーム用でE2EのUIテスト自動化ツールです。

Unityでテストと言えば、元 Unity Test Runner の Unity Test Framework(UTF)がありますが、UTFはUnitテスト専用で、AUTはUIテスト専用のテストツールです。

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

ターゲット

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

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

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

 

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

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

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

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

UTFをやりたい人は、Zenjectを用いることが前提になってしまいますが、ZenjectとUTFを組み合わせたUnitテストをオススメします。

AUT入門

 

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

 
公式のリリースノートが見当たらず、Forum の AltUnity Tester - free UI end-to-end test automation tool for Unity Games およびAsset Store のリリースノートでリリース状況を把握できるようです。

プラン

公式ページ上のプランを確認すると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

  

まずは、新規プロジェクトからAUTだけをインポートし、サンプルを触りながら操作方法を把握していきます。
細かい手順は、公式の Get Started ページを確認しましょう。

  

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 にアップしているチュートリアル動画を参考にしていきます。

 

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

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

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

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");
    }
}
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);
    }
}

 
 

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

課題

上記以外の実装方法について、API Documentation — AltUnity Tools documentation を調べながらAssets/AltUnityTester/Examples/Test/Editor 配下のテストコードを参考に作っていくことで早々にテストコード作りが慣れるのではないでしょうか。

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

C#以外のテストコード

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

まとめ

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

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

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