9/25, 26に開催されたUnite Tokyo 2019の『Unity Test Runnerを活用して内部品質を向上しよう』というセッションの中で、テストはPlayer(Android端末など)でも実行できる旨をきちんとお伝えできていませんでした*1。
以下の質問をいただいたので、これに回答する形でまとめます。
ネイティブプラグインが、Test Runnerの手が届かないせいでいつもテストが書けず、仕様変更でバグが出る温床になる印象があります……
— 峅井はで (@kraihd) 2019年9月26日
ネイティブプラグインをうまくテストしてるよっていう方、どうやってますか?#UniteTokyo
なお、本セッションのスライドはすでにUnity Learning Materialsで公開中。動画は後日公開される予定です。
learning.unity3d.jp togetter.com
セッション全体のフォローアップ記事はこちら。
ネイティブプラグイン自体のテストについて
いきなりオフトピですが、ネイティブプラグイン自体のテストは、C++であればGoogletestやXcodeを使ってC++のレイヤでユニットテストを書くべきです。
以下に紹介する、Unity Test RunnerのPlay Mode tests実機実行は素早く実行できるものではなく*2、Unityプロジェクトとのインテグレーション(結合・統合)を確認するためのテストケースだけに留めておくのが賢明です。
Play Mode testsをPlayer(実機)で実行する
Test Runnerウィンドウ
Play Mode testsは、Player(実機)で実行することができます。逆に言うと、Edit Mode testsは実行できません。しかし、すべてのテストを実機で実行する必要はないはずですので、一般的なロジックのテストはEdit Modeで、特別に実機でも動作させたいテスト*3のみPlay Modeで書くことをおすすめします。
ビルドターゲットを"Android"に切り替えた状態でTest RunnerウィンドウのPlayModeタブを開くと、右上に "Run all in player(Android)" と書かれたボタンが表示されます。 Android端末をUSB接続した状態でこのボタンをクリックすると、すべてのPlay ModeテストがAndroid端末上で実行されます*4。
コマンドライン
コマンドラインからのテスト実行では、引数-testPlatform
に(playmode
の代わりに)実行するBuildTarget文字列を指定することで実行できます。
特定プラットフォームでのみ実行されるテスト
「このテストコードは特定のプラットフォームでのみ実行したい」というケースがあるはずです。
その場合、テストメソッドに[UnityPlatform()]
アトリビュートを付与し、引数にRuntimePlatformを指定できます。
下例の場合、Test RunnerウィンドウではPlay Modeで”Run all in player(Android)”をクリックしたときのみ、コマンドラインでは引数に-testPlatform Android
を指定したときのみ実行されます。
/// <summary>
/// Android playerでのみ実行されるテスト
/// </summary>
[Test]
[UnityPlatform(RuntimePlatform.Android)]
public void RunOnlyAndroid()
{
var platform = Application.platform;
Assert.That(platform, Is.EqualTo(RuntimePlatform.Android));
}
なお、[UnityPlatform]
アトリビュートに指定するのは、RuntimePlatformです。
コマンドライン引数-testPlatform
に指定するBuildTargetとは文字列が異なるものもありますので注意してください。
iOS Playerの場合
今回Androidを例にしました。iOSの場合、例の如くXcodeプロジェクトが生成されてXcodeが起動します。このときiOS端末がUSB接続されていれば、そのまま自動でインストール・実行されます。
ただし、iOS端末は開発機としてUDIDが登録されているもので、Unityプロジェクト側にTeam IDが設定されている必要があります(要するに普通にXcodeでアプリをBuild and Runできるようにしておく必要があります)。 [1/14追記]