実機上でテスト実行/結果収集するツールの紹介


概要

この記事はUnity Advent Calendar 2017の7日目のやつ。

https://qiita.com/advent-calendar/2017/unity


Miymamasuというテストツール作って使っているんだけどそれの紹介をする。


これ。

Miyamasu

https://github.com/sassembla/Miyamasu



実機でしか動作しないものを自動で手軽に適当に動かして、本当に動作するのか試したい、、試したくない、、?

課金機能、

E2E的な処理、

処理速度、

あの画面が表示されるまでにどんな絵がでるの? みたいな。


そんなあれこれを、実機上で動かして収集する話。



Miyamasuでできること一覧

テスト書く -> Editorで実行 -> レポートをSlackに送信

-> Playerで実行(Editor上) -> レポートをSlackに送信

-> Playerで実行(実機) -> レポートをSlackに送信


このオール ハイル テスト感。



サンプルシナリオ

あるシーンをAdditiveで開いて、その上で適当な関数を実行するテストを用意してみようかと。

1.BaseSceneでアプリを起動、

2.TestTargetSceneをロードしてロード後のスクリプトにアクセスし、

3.プロパティが正しいパラメータを返すかをチェックする。

4.その時のスクショを撮る


0.インストール

Miyamasuのunitypackageをここからダウンロードしてunitypackageを実行、とりあえず全部入れる。

Unity -> Window -> Test Runner を押して、テストウィンドウを開く。


ウィンドウが開いたらPlayModeボタンを押す。

スクリーンショット 2017-12-06 17.40.14.png

Enable playmode tests ボタンを押す、するとこんなのが出るので、

スクリーンショット 2017-12-06 17.40.19.png

OKを押してUnityEditorを終了 -> もう一度起動。手で。そう。手で。


もう一度 Test Runner を開くと、

スクリーンショット 2017-12-06 17.40.42.png

こんな感じになってればOK。もうボタン押さないでいい。


このように、プロジェクトごとに、初回だけEditorの再起動が必要になる。


1.まずテストを書く

testのコードを、適当にAssetsフォルダ以下に書く。

こんな感じ。


Assets/Tests.cs

using System.Collections;

using System.Collections.Generic;

using Miyamasu;

using UnityEngine;

using UnityEngine.SceneManagement;


public class Tests : MiyamasuTestRunner {


    [MSetup] public IEnumerator Setup () {

        var loadAdditionalScene = SceneManager.LoadSceneAsync("TestTargetScene", LoadSceneMode.Additive);

        while (!loadAdditionalScene.isDone) {

            yield return null;

        }

    }

    [MTeardown] public IEnumerator Teardown () {

        var unloadAdditionalScene = SceneManager.UnloadSceneAsync("TestTargetScene");

        while (!unloadAdditionalScene.isDone) {

            yield return null;

        }

    }


    [MTest] public IEnumerator CheckRunning () {

        var instance = GameObject.FindObjectOfType<TestTargetScript>();


        NotNull(instance);

        IsTrue(instance.Running);


        yield break;

    }

}


MSetupアトリビュートが付いているメソッドはテスト前に、MTeardownアトリビュートが付いているメソッドはテスト後に実行される。

それぞれTestTargetSceneをロードしたりアンロードしたりしてる。


MTestアトリビュートがついてるメソッドは、Setup、Teardownの間に実行される、テストのメイン部分。

この関数名がそのままテストケースの名前になる。


ここでは、TestTargetScriptのインスタンスを探し、nullでないこと、instane.Runningがtrueを返すことを期待している。

IEnumeratorを返す関数しかテストケースにできないのだけど、今回のテストでは非同期さをテストの対象にしてないので、

yield breakして終わり。



2.Editorでコンパイルが走ると、書いたテストの名称が実行可能なテスト一覧に出る

こんな感じ。

スクリーンショット 2017-12-06 18.10.38.png

で、CheckRunningをダブルクリックで実行! なんかゴウンゴウン動いて、、

無事Passした?


スクリーンショット 2017-12-06 18.11.21.png

やったぜ。


この機構はUnityの5.6以降だと動かせる、UnityTestの機構を使っている。

というかMiyamasuがUnityTestのコードを自動生成しているので、まあ、なんだ、

UnityTestでできることはMiyamasuでも全てできる。


で、Miyamasuを使うとさらに便利なことができる。

例えば「Editorに接続されていない端末でもテストを実行する」「その結果を収集する」とか。

以降で紹介する。



3.Playerでもテストを実行してみる

ここで、思いついたようにPlayを押してみると、先ほどと同じテストがPlayerでも実行される。


スクリーンショット 2017-12-06 18.11.42.png


Playerで実行した場合、GUIがなんか出る。まだ適当なのであまりいいUIではない。


ちなみに全件自動的に実行される。


この状態で実機ビルドを行うと? 

そう、実機でも同じテストが自動的に実行される。結果もGUIから観れる。

今回は割愛するけど、Failした場合はエラーログも出て、端末へとコピーしたりできる。


4.ログ

Editor上で実行した場合は、ログがプロジェクトのフォルダの miyamasu.log ってファイルに吐かれるので、

まだJenkinsとか使ってる人とかはこの辺を使うといいと思う。


あとローカルでtail -f したりすると観やすい。内容はこんな感じ。

スクリーンショット 2017-12-06 18.12.47.png


当然実機上ではこのログは吐かれない。CloudBuildでもログを得るのは面倒臭い。


ではどうする? 

よろしい、Slack連携だ。 (Slack!! Slack!!



5.Slackの設定をしよう

この段階では、Slackへとテストレポートを送る機構が働いていない。


設定は、Unity -> Window -> Miyamasu Test Runner -> Open Settings からできる。

スクリーンショット 2017-12-06 21.28.13.png


slackTokenslackChannelName をセットすると、テストの成否に関わるログが自動的にSlackのそのチャンネルへと転送されるようになる。

これは当然実機で実行した場合もそんな感じなので、こう、なんだ、楽。

slack上ではこんな感じに表示される。

スクリーンショット 2017-12-06 18.55.29.png


デバイス名は自動的に取得される。やったぜ。



5.動作時のスクリーンショットを撮ってSlackに送る

testの途中で、今どんな状況なの?ってのをスクショしたい時あると思うんだけど、

そのへんはコードを足すとできる。


Assets/Tests.cs(抜粋)

    [MTest] public IEnumerator CheckRunning () {

        var instance = GameObject.FindObjectOfType<TestTargetScript>();


        NotNull(instance);

        IsTrue(instance.Running);


        yield return SendScreenshotToSlack("TestTatgetScene”);// これで、この瞬間の画面のスクショを送り出せる。

    }



Slack上にこんな感じでスクショが出る。もちろんMiyamasuのインターフェースは映らない。

スクリーンショット 2017-12-06 20.10.06.png



Sampleリポジトリ

このサンプルシナリオを実装したリポジトリを用意した。


Miyamasu2Slack

https://github.com/sassembla/Miyamasu2Slack



このプロジェクトでは、特定のシーンを読みだしてその時のスクショがどう、みたいなのを実機上でも実行できる。

当然ながらslackTokenとかは入ってないのでこう、なんだ、あれだ、頑張って。


参考 slack設定あれこれ

http://sassembla.github.io/Public/2017:12:06%2013-21-52/2017:12:06%2013-21-52.html