トーフメモ

主にゲーム制作

【Unity】テスト(Unity Test Runner)を試す

使用したバージョン

2018.3.7f1

概要

Unityでテストコードを作ってみます
docs.unity3d.com

手順

f:id:tofgame:20190412165420p:plain
1 テストフォルダ、ファイルを作る

このとき、NUnit等を使用するためのアセンブリファイルが作成されます。

f:id:tofgame:20190412170013p:plain
2 テストスクリプトを作る

デフォルトのスクリプトが作成されます。
スクリプトは先ほど作成したアセンブリファイルと同じ位置に作成してください。

f:id:tofgame:20190412195341p:plain
3 Test Runnerを開く

f:id:tofgame:20190412202149p:plain
4 「Run All」をクリックする

チェックマークがつけば問題なく動いています。

デフォルトのテストスクリプト

作られるテストスクリプトの中身はこうなっています。

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

namespace Tests
{
    public class NewTestScript
    {
        // A Test behaves as an ordinary method
        [Test]
        public void NewTestScriptSimplePasses()
        {
            // 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 NewTestScriptWithEnumeratorPasses()
        {
            // Use the Assert class to test conditions.
            // Use yield to skip a frame.
            yield return null;
        }
    }
}

特に注目したい部分をいくつか見てみます。
テストを行うために、TestAttribute、もしくはUnityTestAttributeを使用します。

using NUnit.Framework;

[Test]
using UnityEngine.TestTools;

[UnityTest]

これら二つがテスト用の属性です。
テストを行う場所をタグ付けします。
TestAttributeはいわゆる普通のメソッドのテストに、UnityTestAttributeはコルーチンのテストに使用します。
実際にテストをしてみましょう!

Assertクラス

NUnit.Frameworkには、Assertクラスというものがあります。
Assertクラスに定義されている関数を扱って実際にテストを行えます。

TestAssertion.cs

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

public class TestAssertion : MonoBehaviour {
    //=============================================================
    private bool flag1 = true;
    private bool flag2 = false;
    private GameObject obj = null;

    [Test]
    public void EqualTest () {
        Assert.AreEqual(flag1,flag2,"Not equal.");
    }

    [Test]
    public void SameTest () {
        Assert.AreSame(flag1,flag2,"Not same.");
    }

    [Test]
    public void NullTest () {
        Assert.IsNotNull(obj,"Null.");
    }
}

AreEqual関数は数値が等しいかを調べます。
AreSame関数は同じオブジェクトかを調べます。
IsNotNull関数はnullではないかどうかを調べます。

上記のコードをアセンブリファイルと同じフォルダに置き、テストを走らせます。
flag1とflag2は等しくなく、同じオブジェクトでもないし、objはnullなので、全てチェックではなくバツが付くはずです。
f:id:tofgame:20190412213548p:plain

関数の条件に合うようにすると、チェックが表示されます。

参考

docs.microsoft.com
github.com