実機上でテスト実行/結果収集するツールの紹介
概要
この記事は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ボタンを押す。
Enable playmode tests ボタンを押す、するとこんなのが出るので、
OKを押してUnityEditorを終了 -> もう一度起動。手で。そう。手で。
もう一度 Test Runner を開くと、
こんな感じになってれば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でコンパイルが走ると、書いたテストの名称が実行可能なテスト一覧に出る
こんな感じ。
で、CheckRunningをダブルクリックで実行! なんかゴウンゴウン動いて、、
無事Passした?
やったぜ。
この機構はUnityの5.6以降だと動かせる、UnityTestの機構を使っている。
というかMiyamasuがUnityTestのコードを自動生成しているので、まあ、なんだ、
UnityTestでできることはMiyamasuでも全てできる。
で、Miyamasuを使うとさらに便利なことができる。
例えば「Editorに接続されていない端末でもテストを実行する」「その結果を収集する」とか。
以降で紹介する。
3.Playerでもテストを実行してみる
ここで、思いついたようにPlayを押してみると、先ほどと同じテストがPlayerでも実行される。
Playerで実行した場合、GUIがなんか出る。まだ適当なのであまりいいUIではない。
ちなみに全件自動的に実行される。
この状態で実機ビルドを行うと?
そう、実機でも同じテストが自動的に実行される。結果もGUIから観れる。
今回は割愛するけど、Failした場合はエラーログも出て、端末へとコピーしたりできる。
4.ログ
Editor上で実行した場合は、ログがプロジェクトのフォルダの miyamasu.log ってファイルに吐かれるので、
まだJenkinsとか使ってる人とかはこの辺を使うといいと思う。
あとローカルでtail -f したりすると観やすい。内容はこんな感じ。
当然実機上ではこのログは吐かれない。CloudBuildでもログを得るのは面倒臭い。
ではどうする?
よろしい、Slack連携だ。 (Slack!! Slack!!
5.Slackの設定をしよう
この段階では、Slackへとテストレポートを送る機構が働いていない。
設定は、Unity -> Window -> Miyamasu Test Runner -> Open Settings からできる。
slackToken、slackChannelName をセットすると、テストの成否に関わるログが自動的にSlackのそのチャンネルへと転送されるようになる。
これは当然実機で実行した場合もそんな感じなので、こう、なんだ、楽。
slack上ではこんな感じに表示される。
デバイス名は自動的に取得される。やったぜ。
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のインターフェースは映らない。
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