はじめに
こんにちは。中山と申します。
この記事は 面白法人グループ 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というクラスがあります。これは以下のようなフローを表します。
これを1回しかループしないようにすると、制御構造でいう順次とか連接とか呼ばれるものと同じ意味になります。
なので、この構造はQAなどで
- チュートリアル突破する
- 何らかのミッションを達成する
- レベルを指定した値まで上げる
- ガチャを引く
というように組み込みで用意しておいたシナリオが指定した順番通りに実行できることを確認したい場合に使うことができます。
また、Groupというのはこれ自身シナリオの一種なのでGroupを入れ子にすることができて、そうするとループに前処理・後処理がついた形のフローを表現することができます。
なので、この構造は自分でシナリオを実装する際にも利用することができます。サンプルでも、組み込みのシナリオの実装で活用してます。
最後に
とあるプロジェクト用に考えた仕組みをオープンソースにしてみました。おそらく他のプロジェクトでも利用できる形になっているのではないかと思います。