Unity TestRunner によるテストコードの作成とテスト方法

Unity自作コンポーネントのスクリプトを書いた際に「これ本当に思ったように動くのかな?」と思ったことがあると思います。
また、過去に作った自作コンポーネントの一部を変更する際に「今までの機能に悪影響はないかな?」と心配になることもあるでしょう。

そんなときに便利なのが、テストコードです。
テストコードを実行することで、少なくともテストコードで行った部分については問題ないことが即座に確認できます。
特に、テストコードを仕様書のようにあらかじめ作成しておき、そこから実装を進めるやり方を TDD(テスト駆動開発:Test Driven Development)と呼びます。

最初は面倒に思いますが、テストコードを開発とともに積み上げていくことで、スクリプトの品質の保証変更時のテストの簡易さなどメリットも大きくなるでしょう。

今回は UnityTest 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 パッケージ準備完了しています。

Unity PackageManager ウィンドウで In Project 内で Test Framework パッケージがあることを確認します。

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

Unity Test Framework パッケージが In Project に無い場合は Unity Registry から探してインストールします。上図のパッケージはまだインストールしていないというだけで選んだ無関係のものです。

Test Framework パッケージが Unity プロジェクトに入っていることが確認できました。
※ Project ウィンドウの Packages フォルダからでも Test Framework フォルダの存在を確認できます。

テスト用のアセンブリ定義ファイルの作成

Unityアセンブリ定義ファイルは、複数のスクリプト一つのモジュール(dll)にまとめる定義を行うファイルです。
デフォルトでは一つの dll にまとめられますが、規模が大きくなった際に機能ごとにモジュールを分ける際に、どのスクリプトをどのモジュールにおさめるかを指定できます。
参照:アセンブリの定義 – Unity マニュアル

Unity のアセンブリ定義ファイルの説明図 公式 ScriptCompilation より 参照:https://docs.unity3d.com/ja/2021.1/Manual/ScriptCompilationAssemblyDefinitionFiles.html

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

Unity Project ウィンドウのポップアップメニューから Create → Testing → Test Assembly Folder を選択します。

そうすると Tests という名前のフォルダが作成されます。

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

Unity Test Framework 用のアセンブリ定義ファイルが作成されました。

空のアセンブリ定義ファイルではないようで、 UNITY_INCLUDE_TESTSTestRunner、 .NET フレームワークのテストで用いられる NUnit などの名前も設定に表示されています。

テスト用スクリプトの作成

しかし、このアセンブリ定義ファイルを作成後警告ログが出ました。スクリプトがないためコンパイルされないだろうと書いてあります。

Unity Test Framework の Tests フォルダの名前を変えると警告ログが出力されました。

Assembly for Assembly Definition File ‘Assets/SakuraCrowd/Tilemap/TestsSCTilemap/TestsSCTilemap.asmdefwill 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] を選択しました。

Unity Test Framework 用アセンブリ定義ファイルのあるフォルダで右クリックし 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] を選択します。

Unity メニュー Window → General → Test Runner を選択します。

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

Unity Test Runner ウィンドウ(PlayMode) に先ほどの TestsSCTilemap フォルダと同じ dll が作成され、その中には作成したスクリプトと関数があります。

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

Unity Project ウィンドウ内にリネームしたはずの Tests フォルダがありその中にはアセンブリ定義ファイルとスクリプトがありました。

テストの実行

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

Unity Test Runner ウィンドウの Run All を選択します。

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

Unity Test Runner(Play Mode) で Run All を選択したあと数秒後、テスト結果がチェックマークで表示されました。

これで、 Test Framework パッケージを使い、テストコードを実行して結果を確認するところまでできました。

まとめ

今回は UnityTest Framework パッケージを用いて、テストを行う手順を紹介しました。

  1. Test Framework パッケージの所在の確認
  2. Testing メニューからテスト用フォルダ(+アセンブリ定義ファイル)の作成
  3. Testing メニューからテスト用スクリプトのスケルトンの作成
  4. スクリプトに実際のテスト処理を追記
  5. Test Runner ウィンドウ (PlayMode) でテスト実行

最初は難しく感じましたが、やってみると作業内容はそこまで多くなかったと思います。
今後もエディタ拡張用のテストや、さまざまなテスト処理のための関数を必要に応じて紹介します。

参照サイト Thank You!

Unity のリアルタイム開発プラットフォーム | 3D/2D、VR/AR のエンジン

レジストリからのインストール – Unity マニュアル

スクリプトのコンパイルとアセンブリ定義ファイル – Unity マニュアル

ユニットテスト – Unity マニュアル

About Unity Test Framework | Test Framework | 1.3.2

[Unity] C#クラス(スクリプト)のテスト方法 | ソフトライム

テスト駆動開発(TDD)とは?TDDの進め方をステップ毎に解説!【ソフトウェア開発・テスト用語 】| Qbook

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました