コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】uGUI の自動テストが行える「Unity UI Test Automation Framework」紹介

はじめに

「Unity UI Test Automation Framework」を Unity プロジェクトに導入することで
uGUI の自動テストが行えるようになります

テストを実行する方法

f:id:baba_s:20180101194000p:plain

Unity メニューの「Window>Test Runner」を選択します

f:id:baba_s:20180101194120p:plain

「Play Mode」を選択して「Rul All」を押します

テストを作成する方法

UITest を継承したクラスを作成し、
UnitTest と同じように UnityTest、SetUp 属性を使用して実装します
下記のコードはテストのサンプルになります

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

public sealed class UITestExample : UITest
{
    private MockNetworkClient mockNetworkClient;

    [SetUp]
    public void Init()
    {
        mockNetworkClient = new MockNetworkClient();
        DependencyInjector.ReplaceComponent<NetworkClient>( mockNetworkClient );
    }

    [UnityTest]
    public IEnumerator SecondScreenCanBeOpenedFromTheFirstOne()
    {
        yield return LoadScene( "TestableGameScene" );
        yield return WaitFor( new ObjectAppeared<FirstScreen>() );
        yield return Press( "Button-OpenSecondScreen" );
        yield return WaitFor( new ObjectAppeared<SecondScreen>() );
        yield return AssertLabel( "SecondScreen/Text", "Second screen" );
        yield return Press( "Button-Close" );
        yield return WaitFor( new ObjectDisappeared<SecondScreen>() );
    }

    [UnityTest]
    public IEnumerator SuccessfulNetworkResponseIsDisplayedOnTheFirstScreen()
    {
        yield return LoadScene( "TestableGameScene" );
        yield return WaitFor( new ObjectAppeared<FirstScreen>() );
        mockNetworkClient.mockResponse = "Success!";
        yield return Press( "Button-NetworkRequest" );
        yield return AssertLabel( "FirstScreen/Text-Response", "Success!" );
        Assert.AreEqual( mockNetworkClient.mockRequest, "i_need_data" );
    }

    [UnityTest]
    public IEnumerator FailingBoolCondition()
    {
        yield return LoadScene( "TestableGameScene" );
        yield return WaitFor( new ObjectAppeared( "FirstScreen" ) );
        var s = Object.FindObjectOfType<FirstScreen>();
        yield return WaitFor( new BoolCondition( () => !s.enabled ) );
    }
}

関連記事