Unity 6 Test Runnerを用いたテスト環境構築と実行方法

2024年12月7日

Unity 6では、コードの品質を向上させ、バグを早期に発見するために、テスト環境を構築することが重要です。この資料では、Unity 6のTest Runnerを使用して、テスト環境の構築と実行方法をステップバイステップで解説します。これにより、プロジェクトの品質管理を効率的に行えるようになります。


この記事で扱うテストについて

本記事では、UnityのTest Runnerを使用して、基本的なユニットテストを実行します。対象となるのは、Calculator クラスの Add メソッドで、以下のシナリオをテストします。

テスト内容Add メソッドに 3 と 4 を渡したとき、正しい結果である 7 を返すかどうかを確認する。

このテストを通じて、Test Runnerの使い方やユニットテストの基本手順を学べます。テストが成功した場合、Test Runnerには「All tests passed」と表示されます。

この記事では、Unity 6のTest Runnerを使用したテスト環境の構築と実行方法について解説します。特に、単体テストの手法を中心に進めていきますが、これはテスト駆動開発(TDD)の要素を取り入れる際にも役立つ内容です。TDDは「最初にテストを書き、そのテストを通過するコードを実装する」開発手法で、コードの品質向上や早期のバグ発見を目的としています。本記事では、TDDの全容を扱うわけではありませんが、TDDを実践する際の基礎知識としても有用な内容を含んでいます。

1. Test Runnerとは

Test Runnerは、Unityでユニットテストやプレイモードテストを実行するためのツールです。これを使用することで、コードの動作確認やリファクタリング時のバグ検出が容易になります。また、テストを自動化することで、コードの品質向上と保守性の向上が期待できます。

2. 初期設定と環境構築

2.1 プロジェクトの準備

  1. Unity Hubを使用して、新規プロジェクトを作成します。
  2. 任意のテンプレートを選択(例: Universal Render Pipeline)。

2.2 Test Runnerウィンドウの開き方

  1. Projectウィンドウで、Assetsフォルダを選択しておきます
  2. Unityのトップメニューから、Window → General → Test Runner を選択します。
    • フローティングウィンドウでTest Runnerウィンドウが表示されます。

3. テストコード保存用フォルダとテストスクリプトの作成

3.1 テストコード保存用フォルダの作成

  1. Test Runnerウィンドウ内で Create a new Test Assembly Folder in the active path をクリックします。
    • TestsフォルダがAssets内に作成されます。

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

  1. Testsフォルダを選択した状態で、Test Runner内の Create a new Test Script in the active path をクリックします。
  2. 自動生成されたスクリプトの名前を CalcTests に変更します。

Test Runnerウィンドウはタブをドラッグして適当な場所に配置しておきましょう

3.3 Unityによって自動的に作成されたサンプルテストスクリプトの実行

Test Runnerの実行

  • Test Runnerウィンドウ内で、Run All ボタンをクリック。
  • テスト結果がウィンドウ内に表示されます:
    • ✔:成功
    • ❌:失敗

何もしないサンプルなので、成功するはずです

3.4 サンプルのテストスクリプトの編集

サンプルコードを以下のコードへ書き換えます

注意: このセクションのコードを実行する前に、Calculator クラスが既に作成されている必要があります。この時点では、Calculator クラスが未定義なので、以下のようなエラーが発生します:

Error CS0246: The type or namespace name 'Calculator' could not be found (are you missing a using directive or an assembly reference?)

上記エラーは、次のセクション「4. テスト対象コードの作成」で Calculator クラスを定義した時点で解消されます

このテストでは、Calculator クラスの Add メソッドが正しい結果を返すか、さまざまな条件下で確認します。

using NUnit.Framework;

public class CalcTests
{
    private Calculator _calculator;

    [SetUp]
    public void Setup()
    {
        _calculator = new Calculator();
    }

    [Test]
    public void Add_ReturnsCorrectSum_WhenGivenTwoPositiveNumbers()
    {
        int result = _calculator.Add(5, 3);
        Assert.That(result, Is.EqualTo(8), "5と3を足すと8になるべきです。");
    }

    [Test]
    public void Add_ReturnsCorrectSum_WhenGivenNegativeAndPositiveNumbers()
    {
        int result = _calculator.Add(-2, 5);
        Assert.That(result, Is.EqualTo(3), "-2と5を足すと3になるべきです。");
    }

    [Test]
    public void Add_ReturnsCorrectSum_WhenGivenTwoNegativeNumbers()
    {
        int result = _calculator.Add(-3, -7);
        Assert.That(result, Is.EqualTo(-10), "-3と-7を足すと-10になるべきです。");
    }

    [Test]
    public void Add_DoesNotReturnIncorrectValue()
    {
        int result = _calculator.Add(2, 2);
        Assert.That(result, Is.Not.EqualTo(5), "2と2を足した結果が5になるべきではありません。");
    }
}

このテストクラスには4つのテストメソッドが含まれています。

  • Setupメソッド: 各テストの前にCalculatorインスタンスを生成し、テストの準備を行います。
  • Add_ReturnsCorrectSum_WhenGivenTwoPositiveNumbers: 2つの正の整数を加算した結果が正しいことを確認します。
  • Add_ReturnsCorrectSum_WhenGivenNegativeAndPositiveNumbers: 負の整数と正の整数を加算した結果が正しいことを確認します。
  • Add_ReturnsCorrectSum_WhenGivenTwoNegativeNumbers: 2つの負の整数を加算した結果が正しいことを確認します。
  • Add_DoesNotReturnIncorrectValue: 加算結果が誤った値にならないことを確認します。

これらのテストにより、CalculatorクラスのAddメソッドがさまざまなケースで正しく動作するかどうかを自動的に検証できます。

4 テスト対象コードの作成

実際にテストされるコードは実行コードになります
今回は、足し算の計算メソッドをテストすることにしています

4.1 Scriptsフォルダを作成

新しく、スクリプトを保存しておくフォルダを作成します

4.2 テスト対象のスクリプト作成

新しく、スクリプト作成します

4.3 スクリプトコード

スクリプト内容は次のようにします

// Calculator.cs

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

このCalculatorクラスは単純な加算処理を行うクラスで、Addメソッドは2つの整数を受け取り、その合計を返します。このようにシンプルなクラスを使うことで、テストの基本的な仕組みを学ぶことができます。

5 アセンブリ定義ファイルの作成

アセンブリ定義ファイルは、スクリプトを小さな単位で管理し、依存関係を制御するためのツールです。これを使うことで、変更があったスクリプトだけを効率的にコンパイルし、作業時間を短縮できます。また、コードの依存関係を明示的に設定することで、プロジェクトが複雑化してもトラブルを防ぐことができます。

5.1 テスト対象スクリプトのフォルダにアセンブリ定義ファイルを作成

  1. Projectウィンドウでテスト対象スクリプトが保存されているフォルダを右クリックします  Create → Scripting → Assembly Definition を選択します。
  2. 作成されたファイルの名前を CalculatorAsm に変更します。

5.2 テスト用アセンブリ定義ファイルに依存関係を登録

  1. ProjectウィンドウでTestフォルダを選択し、その中にあるテスト用アセンブリ定義ファイル(Tests)をクリックします。
  2. Inspectorウィンドウの「Assembly Definition References」セクションに移動します。
  3. 「+」ボタンをクリックして CalculatorAsm を選択します。
  4. Apply ボタンをクリックして保存します。

6. Test Runnerの実行

  1. Test Runnerウィンドウ内で、Run All ボタンをクリック。
  2. テスト結果がウィンドウ内に表示されます:

参考

TestCase 属性を活用したリファクタリング

TestCase 属性を使用することで、1つのメソッドに複数のテストケースを記述できます。以下はリファクタリング後のコード例です。

using NUnit.Framework;

public class CalcTests
{
    private Calculator _calculator;

    [SetUp]
    public void Setup()
    {
        _calculator = new Calculator();
    }

    [TestCase(5, 3, 8, "5と3を足すと8になるべきです。")]
    [TestCase(-2, 5, 3, "-2と5を足すと3になるべきです。")]
    [TestCase(-3, -7, -10, "-3と-7を足すと-10になるべきです。")]
    public void Add_ReturnsCorrectSum(int a, int b, int expected, string message)
    {
        int result = _calculator.Add(a, b);
        Assert.That(result, Is.EqualTo(expected), message);
    }

    [Test]
    public void Add_DoesNotReturnIncorrectValue()
    {
        int result = _calculator.Add(2, 2);
        Assert.That(result, Is.Not.EqualTo(5), "2と2を足した結果が5になるべきではありません。");
    }
}

TestCase 属性の解説

TestCase 属性を使用することで、1つのテストメソッドに複数のケースを渡すことができます。

基本構文

[TestCase(入力値1, 入力値2, 期待値, "説明メッセージ")]
public void メソッド名(型 引数1, 型 引数2, 型 期待値, 型 メッセージ)

使用例

上記のコードでは、Add_ReturnsCorrectSum メソッドに以下の3つのケースを定義しています。

  • 5 + 3 = 8
  • -2 + 5 = 3
  • -3 + -7 = -10

これにより、同様のロジックをテストするコードを1つのメソッドに集約でき、コードの簡潔さとメンテナンス性が向上します。


テストコードをリファクタリングするメリット

  1. コードの重複を削減
    複数のテストケースを1つのメソッドに集約することで、コードの重複を減らせます。
  2. 可読性の向上
    入力値と期待値が一箇所にまとめられるため、テストケースの内容が分かりやすくなります。
  3. メンテナンス性の向上
    テストケースを追加する際に、新しいメソッドを作成する必要がなくなり、柔軟に対応できます。

注意点

  • 異なるテストロジックを1つのメソッドにまとめない
    TestCase を使用しても、論理的に異なるテストを1つのメソッドに含めるのは避けましょう。今回の例では Add_DoesNotReturnIncorrectValue を独立したメソッドとして保持しています。
  • 過剰なパラメータ化の回避
    複雑なロジックをテストする場合は、個別のテストメソッドに分ける方が適切です。

まとめ

NUnitのTestCase属性を使用すると、テストコードの重複を減らし、メンテナンス性を向上させることができます。この技術を活用し、効率的なテストコードを作成しましょう。

アセンブリ定義に関する解説

C#,Test,Unity

Posted by hidepon