【Unity】テスト結果を「不確定」にするAssert.AssumeとAssert.Inconclusiveの使い方

Unityでテスト結果を「不確定」にするAssert.AssumeAssert.Inconclusiveの使い方についてまとめました。

はじめに

Unityでテストを書く際に、例えば「デバッグメニューが有効な場合だけ実行できる」など、実行のための前提条件があるテストについて考えます。

前提条件が満たされていない状態で普通にテストを実行すると、テストがエラーになってしまいます。
そのため、まず考えられる対応策として、Assert.Ignoreでテストの実行をスキップすることが挙げられます。

using NUnit.Framework;

internal sealed class ExampleTest
{
    [Test]
    public void テストをスキップ()
    {
        Assert.Ignore("This test is skipped.");
    }
}

しかしこれはあくまでテストを「未実行状態」として扱うため、テスト結果に含まれません。
スキップされたテストは、Test Runner上は下図のように破線の円で表現されます。

未実行状態

テスト結果を「不確定」にする

前節のように前提条件が満たされていない時にそれをテストから除外していい場合にはAssert.Ignore を使えば問題ありません。
しかし、「テストは実行したが、前提条件が満たされていないので結果なし」という結果を得たい場合にはこれでは不足しています。

このようなケースでは以下のようにAssume.Thatで前提条件を判定すると、それが満たされない時にテスト結果を「未定義」として完了します。

using NUnit.Framework;
using UnityEngine;

internal sealed class ExampleTest
{
    [Test]
    public void 結果不確定のテスト()
    {
        var isDebugMenuEnabled = false;
        Assume.That(isDebugMenuEnabled);
        
        Debug.Log("This line will not be executed.");
    }
}

結果未定義となったテストは、Test Runner上は下図のようにオレンジ色の円で表現されます。

結果未定義

以下のように、Assume.That の代わりに Assume.Inconclusive を使用することもできます。

using NUnit.Framework;
using UnityEngine;

internal sealed class ExampleTest
{
    [Test]
    public void 結果不確定のテスト()
    {
        var isDebugMenuEnabled = false;
        if (!isDebugMenuEnabled)
        {
            Assert.Inconclusive("This test is inconclusive.");
        }
        
        Debug.Log("This line will not be executed.");
    }
}

なおTest Runnerのウィンドウの左下には Export Results ボタンがありますが、これを押下して出力された結果ファイルを見ると、当該テストが Inconclusive としてマークされていることを確認できます。