やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Unity Automated QA雑感

Unity Automated QA パッケージが公開されました。 まだアルファリリース (0.2.0-preview.3) ですが、少し触ってみたメモ。

[12/26追記]v0.8.1対応の『Unity Automated QA攻略ガイド』をコミックマーケット99で頒布します。詳しくはこちらの記事を参照してください

www.nowsprinting.com

概要

Unityエディタ上で動く、uGUI操作のキャプチャ&リプレイ機能です。 Required: Unity 2019.4+

操作記録はjsonで保存され、エディタ上で再生できます。 また、Play mode testsに組み込んで実行でき、さらにAWS Device Farm上のAndroid端末で実行することもできます。

細かいところはまだ発展途上という感ですが、再生機能がかしこくなってくれればそれ単独で使いではありそうですし、 コンポジット機能が実用的になってくれれば(具体的にはuGUI以外も扱えるようになれば)Unityアプリの統合テストフレームワークとして有力になりそうです*1

以下、検証したときのメモです。

Recorded Playback

  • Window | Automated QA | Recorded Playback でウィンドウ表示
  • RecordクリックでPlay modeになり、StopクリックまでのuGUI操作がjsonに記録される
  • 記録したjsonはリスト表示され、Playクリックで再生
  • jsonファイル名はデフォルトでタイムスタンプ、リネーム可能
  • Assertの機構はない
  • 対象オブジェクトが無いなど操作できない場合、コンソールに Warning Error *2 メッセージを出して再生が継続される
  • 実行時にスクショを取っている(~/Library/下に出力され、参照するUIは無い)

jsonフォーマットについて

  • 時間(timeDelta)、座標、object name, tag, hierarchy, offset が記録されている。いい感じに再生時に解釈してくれていることを期待
  • イベントはpointer-down/upで記録しているので、長押しやドラッグも表現できている
  • ButtonのTextやImageは(要するに子オブジェクトまでは)拾っていない
  • idも保持していない。都度変わるので保存しても仕方ないから?
  • Sceneも記録されているがRecorded Playbackでは使用されない(PlayでそのSceneを開いたりはしない)。後述のRecorded Testing機能で使用される

Composite Recordings

  • Window | Automated QA | Advanced | Composite Recordings でウィンドウ表示
  • 複数の操作記録jsonを選択し、つなげたjsonを生成(マージされるのでなく各jsonをポイントするjsonを生成)
  • 部分操作を記録できる(上記Recorded PlaybackだとPlay modeのライフサイクルでしか撮れないので)
  • こちらもAssertの機構はない
  • 将来的に、記録した操作だけでなくC#スクリプトやML-Agentsのエージェントを組み込めるようにしたいとのこと

Recorded Testing

  • Tools*3 | Automated QA | Generate Recorded Tests で、 Assets/AutomatedTesting/GeneratedTests下にPlay modeテストコードが出力される
  • asmdefも作られる
  • テストコードは操作記録jsonと1:1で、中身はjsonを読んで再生している。再生終了後にAssertを自分で追加することは可能
  • テストケースごとに、jsonに記録されているSceneをロードしてから再生してくれる
  • 対象オブジェクトが無いなど操作できない場合、コンソールに Warningメッセージを出して再生が継続される(Recorded Playbackウィンドウでの再生と同様) Errorログを出力して再生は継続されるが、このログのためテストはFailする *4

生成されるテストコードの例

[UnityTest]
[RecordedTest("Recordings/composite-recording-2021-04-19-T01-05-01.json")]
public IEnumerator CanPlayToEnd()
{
    yield return RecordedTesting.TestPlayToEnd();
    Assert.IsTrue(true);
}

この機能で遭遇したエラーとその回避方法はこちらのエントリを参照。

www.nowsprinting.com

Running Recorded Tests on a Cloud Device Farm

  • AWS Device Farm上のAndroid端末でもテスト実行できる*5AWSとの直接契約・操作は不要
    • アーリーアクセス機能
    • 2021/6まで、Unity Proアカウントに100hのクラウドテストを無料トライアル
    • 以降 $10/device/hour *6 *7
  • アップロードなどのUIは実装されている(権利がなくて未検証)

参考

docs.unity3d.com

forum.unity.com

blogs.unity3d.com

*1:到達点は統合テストだと思うので、QAという名前は違和感ありますが。それはそれ

*2:v0.3.1で変更された

*3:なぜ一箇所にまとめてくれないのか

*4:v0.3.1で変更された。もし操作不能を無視してテストを成功させたければ、LogAssertを使えばいい

*5:Automated QAのテストに限らず、and other Unity testsが実行可能。であればパッケージ分けてほしかった

*6:AWS Device Farmを直接使っても $0.17/device/minute == $10.2/device/hour なのでむしろ少し安い。see: https://aws.amazon.com/device-farm/pricing/

*7:表記がhourなのでhour単位に切り上げられる恐れはあるかも。要確認