Unityでシナリオベースの自動テストをする

はじめに

こんにちは。中山と申します。

この記事は 面白法人グループ Advent Calendar 2022 の18日目の記事です。

Unityでシナリオベースの自動テストをする方法について紹介します。

作ったもの

techblog.kayac.com こちらで無差別に画面をタップして行う自動テストについて紹介されていますが、これにシナリオに従って画面を操作する機能を追加したものになります。

あらかじめ「チュートリアルを突破する」「指定したレベルになるまでゲームを周回する」「特定のミッションをクリアする」といったシナリオを実装しておいて、それらを好きな順序で実行させるというようなことができます。

https://github.com/quartorz/unity-autotap
作ったものはこちらで公開しています。

UnityエディタでPackage Managerを開いて、 Add package from git URL... を選択して https://github.com/quartorz/unity-autotap.git?path=Assets/AutoTap と入力するとインストールできます。

サンプル

Assets/Sample 以下に動作確認用のシーンと自動テストの実装を置いてあります。構成は以下の通りです。

  • Assets/Sample/App
    • 動作確認用のシーン
  • Assets/Sample/Scripts, Assets/Sample/Prefabs
    • 自動テストの実装のサンプル

動作確認用のシーンは自動テストの実装に一切依存しないように作ってあるので、同じように作ればリリース用のビルドには自動テストの実装を一切含めないようにするといったこともできます。

Assets/Sample/Scripts/DebugManager.cs に自動テストを起動する処理を書いてあって、以下の機能を実装してあります。

  • 画面をランダムにタップする
  • C#のコードでシナリオを構成して、そのシナリオ通りに画面をタップする
  • C#のコードで構成したシナリオ通りに画面をタップして、その最中に専用のUIでシナリオの設定を変更できるようにする
  • 組み込みのシナリオを組み合わせて作ったシナリオをJSON形式で与えて、そのシナリオ通りに画面をタップする

これらの機能はSampleSceneの中にあるDebugManagerのインスペクタから実行できるようにしてあります。

自動テストの実装について

AutoTapBase, ScenarioBasedAutoTap

実際に画面をタップする処理など、自動テストのコアになる機能を提供するクラスです。

Assets/AutoTap/Scripts 以下に抽象クラスとして置いてあって、プロジェクトごとにこれらを継承したクラスを用意する必要があります。

シナリオ

ここでは、シナリオは以下のように前処理・本体・後処理の3つの部分を持つことができるということにしています。

前処理・本体・後処理を持つシナリオ

動作確認用の実装で用意しているシナリオはすべてこの構造に従うように作ってあります。

Group

Assets/AutoTap/Scripts にGroupというクラスがあります。これは以下のようなフローを表します。

Group

これを1回しかループしないようにすると、制御構造でいう順次とか連接とか呼ばれるものと同じ意味になります。

1回しかループしないGroup

なので、この構造はQAなどで

  1. チュートリアル突破する
  2. 何らかのミッションを達成する
  3. レベルを指定した値まで上げる
  4. ガチャを引く

というように組み込みで用意しておいたシナリオが指定した順番通りに実行できることを確認したい場合に使うことができます。

また、Groupというのはこれ自身シナリオの一種なのでGroupを入れ子にすることができて、そうするとループに前処理・後処理がついた形のフローを表現することができます。

入れ子にしたGroup

なので、この構造は自分でシナリオを実装する際にも利用することができます。サンプルでも、組み込みのシナリオの実装で活用してます。

最後に

とあるプロジェクト用に考えた仕組みをオープンソースにしてみました。おそらく他のプロジェクトでも利用できる形になっているのではないかと思います。