Unity で自作コンポーネントのスクリプトを書いた際に「これ本当に思ったように動くのかな?」と思ったことがあると思います。
また、過去に作った自作コンポーネントの一部を変更する際に「今までの機能に悪影響はないかな?」と心配になることもあるでしょう。
そんなときに便利なのが、テストコードです。
テストコードを実行することで、少なくともテストコードで行った部分については問題ないことが即座に確認できます。
特に、テストコードを仕様書のようにあらかじめ作成しておき、そこから実装を進めるやり方を TDD(テスト駆動開発:Test Driven Development)と呼びます。
最初は面倒に思いますが、テストコードを開発とともに積み上げていくことで、スクリプトの品質の保証、変更時のテストの簡易さなどメリットも大きくなるでしょう。
今回は Unity の Test Framework パッケージを用いてテストを行うまでの手順を紹介します。
※ Unity は 2021.3.14f1、Test Framework パッケージは Version 1.1.33、Visual Studio は Community 版 Version 17.2.5、 OS は Windows 10 です。
Unity Test Framework の利用の流れ
調べているとテスト用の関数の前に [Test] とか [UnityTest] とか属性をつければいいのかなと思いますが、それだけではテストされません。
Test Framework パッケージの確認
Unity の Test Framework (UTF, 旧名称:Unity Test Runner) は、Release 版のパッケージとして提供されているので「Test Framework 」パッケージが Unity プロジェクトに含まれていることを確認します。
メニュー [Window]→[Package Manager] を選択して「Package Manager」ウィンドウをひらきます。
左上の Packages のプルダウンリストで In Project を選択し、右上の検索ボックスで Test Framework と入力します。
インストール済みならば、 Test Framework パッケージの準備は完了しています。

もしも Test Framework パッケージが Packages: In Project に見当たらない場合は、 Packages: Unity Registry でパッケージを探しインストールしましょう。
参照:レジストリからのインストール – Unity マニュアル

Test Framework パッケージが Unity プロジェクトに入っていることが確認できました。
※ Project ウィンドウの Packages フォルダからでも Test Framework フォルダの存在を確認できます。
テスト用のアセンブリ定義ファイルの作成
Unity のアセンブリ定義ファイルは、複数のスクリプトを一つのモジュール(dll)にまとめる定義を行うファイルです。
デフォルトでは一つの dll にまとめられますが、規模が大きくなった際に機能ごとにモジュールを分ける際に、どのスクリプトをどのモジュールにおさめるかを指定できます。
参照:アセンブリの定義 – Unity マニュアル

Test Framework パッケージでは、テスト用のモジュールをアセンブリ定義ファイルによって作成します。
Project ウィンドウのフォルダ余白で右クリックしポップアップメニュー[Create]→[Testing]→[Tests Assembly Folder] を選択します。

そうすると Tests という名前のフォルダが作成されます。
ちなみに筆者は、まだフォルダ名が確定していない時点で TestsSCTilemap とフォルダ名を変更しました。
そうすると、そのフォルダの中にも TestsSCTilemap というアセンブリ定義ファイルが作成されました。

空のアセンブリ定義ファイルではないようで、 UNITY_INCLUDE_TESTS や TestRunner、 .NET フレームワークのテストで用いられる NUnit などの名前も設定に表示されています。
テスト用スクリプトの作成
しかし、このアセンブリ定義ファイルを作成後警告ログが出ました。スクリプトがないためコンパイルされないだろうと書いてあります。

Assembly for Assembly Definition File ‘Assets/SakuraCrowd/Tilemap/TestsSCTilemap/TestsSCTilemap.asmdef‘ will not be compiled, because it has no scripts associated with it.
UnityEditor.Scripting.ScriptCompilation.EditorCompilationInterface:TickCompilationPipeline (UnityEditor.Scripting.ScriptCompilation.EditorScriptCompilationOptions,UnityEditor.BuildTargetGroup,UnityEditor.BuildTarget,int,string[])
テスト用のスクリプトが同じフォルダにあれば良いと思ったので、アセンブリ定義ファイル TestsSCTilemap.asmdef のある同じフォルダで右クリックしてポップアップメニュー[Create]→[Testing]→[C# Test Script] を選択しました。

名前は TestSCTilemapExtensions.cs にしました。最初の Test を取り除いた名前のスクリプトのテストだからです。
最初からスケルトンのコードができていたので、空のテスト関数 TestSCTilemapExtensionsSimplePasses に Assert から始まるテスト用の処理を1行追記しました。
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
public class TestSCTilemapExtensions
{
// A Test behaves as an ordinary method
[Test]
public void TestSCTilemapExtensionsSimplePasses()
{
// Use the Assert class to test conditions
Assert.That(1, Is.EqualTo(1)); // 追加したテスト項目。 「1 は 1 と同じでしたか?」
}
// A UnityTest behaves like a coroutine in Play Mode. In Edit Mode you can use
// `yield return null;` to skip a frame.
[UnityTest]
public IEnumerator TestTestSCTilemapExtensionsWithEnumeratorPasses()
{
// Use the Assert class to test conditions.
// Use yield to skip a frame.
yield return null;
}
}
Test Runner ウィンドウからのテストの実行
メニュー [Window]→[General]→[Test Runner] を選択します。

「Test Runner」ウィンドウが表示されました。
上側にある Mode のボタンが EditMode の際は空でしたが、 PlayMode に変えると先ほど Test Framework Folder で作成したフォルダ名と同じ dll があり、作成したスクリプトのファイルや関数がツリー形式で表示されています。

実は先ほどフォルダをリネームした前後で、いつの間にか Tests フォルダが作られていて、Tests アセンブリ定義ファイルと NewTestScript.cs が作られていました。
それも別のテスト用モジュールとして表示されています。
このことから Tests フォルダにこだわらず名前を変えても認識されることがわかりました。

テストの実行
テストを実行するには Test Runner ウィンドウの左上の Run All を選択します。
※シーンが未保存の場合ダイアログが表示されるので Save ボタンを押します。

Unity エディタでテストプレイが数秒行われ、プログレスバーがしばらく表示されたあと、テスト結果がチェックマークで表示されました。すべてのテストにクリアしました。

これで、 Test Framework パッケージを使い、テストコードを実行して結果を確認するところまでできました。
まとめ
今回は Unity の Test Framework パッケージを用いて、テストを行う手順を紹介しました。
- Test Framework パッケージの所在の確認
- Testing メニューからテスト用フォルダ(+アセンブリ定義ファイル)の作成
- Testing メニューからテスト用スクリプトのスケルトンの作成
- スクリプトに実際のテスト処理を追記
- Test Runner ウィンドウ (PlayMode) でテストを実行
最初は難しく感じましたが、やってみると作業内容はそこまで多くなかったと思います。
今後もエディタ拡張用のテストや、さまざまなテスト処理のための関数を必要に応じて紹介します。
参照サイト Thank You!
Unity のリアルタイム開発プラットフォーム | 3D/2D、VR/AR のエンジン
スクリプトのコンパイルとアセンブリ定義ファイル – Unity マニュアル
About Unity Test Framework | Test Framework | 1.3.2
[Unity] C#クラス(スクリプト)のテスト方法 | ソフトライム
テスト駆動開発(TDD)とは?TDDの進め方をステップ毎に解説!【ソフトウェア開発・テスト用語 】| Qbook
記事一覧 → Compota-Soft-Press
コメント