🐙

Unity Testを使ってみる

2023/09/21に公開

UnityでのTDD(テスト駆動開発)をするために、Uinity Testを利用して開発していく。
この記事では、あらかじめUnityTestFrameworkを有効化していることを前提としている。

Testファイルの作成

Assetsでtestファイルを追加する。

すると、Testフォルダーが出現する。
今回は、C#スクリプトでテストコードを書きたいので、C#スクリプトのテストファイルを作成する。

C#ファイルを開いてみよう

開くと、次のようなコードが書かれている。

using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;

public class sampleTest
{
    // A Test behaves as an ordinary method
    [Test]
    public void sampleTestSimplePasses()
    {
        // Use the Assert class to test conditions
    }

    // 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 sampleTestWithEnumeratorPasses()
    {
        // Use the Assert class to test conditions.
        // Use yield to skip a frame.
        yield return null;
    }
}

今回のデフォルトでは、NewTestScriptのクラスが作成されている。

public class NewTestScript
{
    // ...
}

この中にTestメソッドを作成していく。

editmode用のテストファイルはまた別に作成する。

Test属性

[Test]
public void NewTestScriptSimplePasses()
{
    // Use the Assert class to test conditions
}

Test属性が付与されたメソッドは単純なテストケースを実行する。

[Test]
public void AddNumbersTest()
{
    Assert.AreEqual(4, 2 + 2);
}

他の言語でTDDやっている人ではお馴染みの、Assertで書けば良いパターンである。

特徴

  • 環境: Edit Modeで実行される。ゲームがプレイ中でなくてもテストが実行できる。

  • 戻り値: void 型を返す必要がある

  • 実行速度: 非常に高速

  • フレームスキップ: フレームをスキップできない

  • 用途: 主にユニットテストに使用される

UnityTest

[UnityTest]
public IEnumerator NewTestScriptWithEnumeratorPasses()
{
// Use the Assert class to test conditions.
// Use yield to skip a frame.
    yield return null;
}

Unity Testを付与されたテストは、複雑に「組み合わされた」テストを実行する。

以下は、
オブジェクトを作成し、GameObjectが正しく移動するかどうかを確認するシンプルな例である。

[UnityTest]
public IEnumerator MoveObjectTest()
{
    GameObject obj = new GameObject();
    obj.transform.position = Vector3.zero;
    yield return new WaitForSeconds(1);
    obj.transform.position = Vector3.up;
    Assert.AreEqual(Vector3.up, obj.transform.position);
    yield return null;
}

特徴

  • 環境: Play Modeで実行される。つまり、ゲームが動作中である必要がある。

  • 戻り値: IEnumerator 型を返す必要がある。

  • 実行速度: 通常は[Test]よりも遅い。

  • フレームスキップ: yield return null; を使用してフレームをスキップできる。これは、時間がかかる操作や非同期のテストに便利。

  • 用途: 主に統合テストやUIテストに使用される。

まとめ

これらを理解することで、ようやくテストが書けるようになります。
Unity Test Runnerを駆使して、TDDを始めていきましょう。

Discussion