Unity Test Toolsを使ってみる

2016年1月28日

Unity でユニットテストができないか調べてみたら、Unity Test Tools なるものが公開されているのを見つけました。
去年から公開されているみたいですが、知りませんでした。

さっそく Asset Store からダウンロードして使ってみました。

20151009_unity_test_tools_01

Unity Test Tools をインポートすると、Project 内に「UnityTestTools」という名称で追加されます。
これが追加されると、Unity のメインメニューに “Unity Test Tools" という項目が増えます。

20151009_unity_test_tools_02

テストコード自体は C# のスクリプトを書いていくことになります。
このとき、スクリプトファイルはプロジェクト内の “Assets/Editor" のディレクトリに作成しないといけません。
Editor 以外のディレクトリに置いていると、テストに使用する NUnit を参照することができないため、テストスクリプトが動作しません。

最初、Editer ディレクトリに置いてなくて、NUnit でエラーが出て悩みました。

最小構成のテストコードは、このようになります。

// これがないとテストができない.
using NUnit.Framework;

namespace UnitTest
{
    [TestFixture]
    class SampleUnitTest
    {
        [Test]
        public void TestSampleSuccess ()
        {
            // 必ず成功するテスト.
            int foobar = 0;
            Assert.AreEqual(0, foobar);
        }
    }
}

テストケースになるメソッドは、"public void" で宣言している必要があります。
また、メソッド宣言の手前に “[Test]” を付けます。これが付いていないと、テストケースとして認識されません。

各処理の合否判定は、Assert クラスを使用して行います。
Unity Test Tools では、Assert での判定結果が false になるケースがひとつでも発生した場合に、テストに失敗したものとして扱われます。
Assert に一度も失敗しなければ、テスト成功ということになります。

スクリプトに記述したテストを実行するには、テスト用のウィンドウを開く必要があります。
メインメニューから Unity Test Tools -> Unit Test Runner を選択します。
すると、テストを実行するための “Unit Tests" というウィンドウが表示されます。

20151009_unity_test_tools_03

テストケースの一覧は、テストファイル名 -> namespace -> クラス名、の順に階層分けされて表示されます。

ウィンドウ上部の左側にあるボタンで、それぞれテストを実行できます。

Run All: すべてのテストを実行
Run Selected: 選択状態のテストを実行
Rerun Failed: 失敗したテストを再実行

ウィンドウ上部の右側に並んでいる 4 つの数字は、ステータスです。
左から順に、成功したテスト数、失敗したテスト数、無視したテスト数、未実施のテスト数、という具合です。
この時点ではテストを一度も実施していないので、右端の未実施のテスト数が 1 になっています。

ということで、試しに前述のテストケースを実行すると、このような結果になります。

20151009_unity_test_tools_04

必ず成功するテストケースになっているので、一番左の数字が 1 になりました。
代わりに、テストが実行されたので未実施のテスト数が 0 になっています。
サンプルでは、テストケースが TestSampleSuccess だけなので、上の階層もすべて成功という表示になっています。

さて、テストに失敗した場合はどうなるかですが、以下のテストケースを追加してみます。

[Test]
public void TestSampleFailed ()
{
    // 必ず失敗するテスト.
    int foobar = 0;
    Assert.AreEqual(1, foobar);
}

テストを追加すると、Unit Tests の表示はこのようになります。
テストケースが増えたので、未実施のテスト数が 1 になりました。

20151009_unity_test_tools_05

実行すると、このようになります。

20151009_unity_test_tools_06

TestSampleFailed のテストに失敗しているので、上の階層もすべて失敗に変わりました。

テストに失敗した場合には、失敗したテストケースを選択すると、このようにどこで失敗したかを教えてくれます。
多くの場合は、失敗したテストケースの記述されているスクリプト名と、失敗した Assert の行番号が表示されます。

20151009_unity_test_tools_07

なお、テストケースの合否を問わず、テストケースを選択するとテストにかかった時間が表示されます。
これを使って、簡易的な処理速度の確認もできたりします。

基本はこのくらいですが、Unity Test Tools のサンプルに寄ると、もっと細かくテストができたり結合テストができたりするようですが、まだ試してません。
また試したらまとめます。

最後に 1 点。
Unity Test Tools は、スクリプトエディタでテストケースを記述した後に Unity にフォーカスを移すと、更新のあったファイルを自動で読み込み直してくれます。
この処理を行っているときには、Unity のウィンドウの右下で砂時計が動いています。
この砂時計が動いているときにテストを実行すると、高確率で Unity がクラッシュします。
テストスクリプトが長くなってくると、再読み込みにかかる時間も伸びてくるので、注意が必要です。

おしまい。

スポンサーリンク