Version: 2019.1
Unity Test Runner
C# 컴파일러

Unity 테스트 러너에서 테스트 작성 및 실행

Unity 테스트 러너(Test Runner)는 Edit 모드와 Play 모드에서 코드를 테스트하며 스탠드얼론, Android, iOS와 같은 타겟 플랫폼에서도 사용 가능합니다.

이 페이지에서는 Unity 테스트 러너로 테스트를 작성 및 실행하는 방법을 다루며, 사용자가 스크립팅Unity 테스트 러너에 대해 이해하고 있다고 가정합니다.

Unity는 XML 포맷으로 테스트 결과를 제공합니다. 자세한 내용은 XML 포맷 테스트 결과에 대한 NUnit 문서를 참조하십시오.

UnityTestAttribute

UnityTestAttribute를 사용할 때는 IEnumerator를 반환해야 합니다. Play 모드에서 테스트를 코루틴으로 실행하십시오. Edit 모드에서 테스트가 null을 생성하면 현재 프레임을 건너뛸 수 있습니다.

참고: WebGL 및 WSA 플랫폼은 UnityTestAttribute를 지원하지 않습니다.

Regular NUnit 테스트(Edit 모드와 Play 모드에서 동작)

[Test]
public void GameObject_CreatedWithGiven_WillHaveTheName()
{
    var go = new GameObject("MyGameObject");
    Assert.AreEqual("MyGameObject", go.name);
}

Play 모드 예제

[UnityTest]
public IEnumerator GameObject_WithRigidBody_WillBeAffectedByPhysics()
{
    var go = new GameObject();
    go.AddComponent<Rigidbody>();
    var originalPosition = go.transform.position.y;

    yield return new WaitForFixedUpdate();

    Assert.AreNotEqual(originalPosition, go.transform.position.y);
}

Edit 모드 예제:

[UnityTest]
public IEnumerator EditorUtility_WhenExecuted_ReturnsSuccess()
{
    var utility = RunEditorUtilityInTheBackground();

    while (utility.isRunning)
    {
        yield return null;
    }

    Assert.IsTrue(utility.isSuccess);
}

UnityPlatformAttribute

UnityPlatformAttribute를 사용하여 실행 중인 플랫폼을 기반으로 테스트를 필터링하십시오. NUnit PlatformAttribute처럼 동작합니다.

[Test]
[UnityPlatform (RuntimePlatform.WindowsPlayer)]
public void TestMethod1()
{
   Assert.AreEqual(Application.platform, RuntimePlatform.WindowsPlayer);
}

[Test]
[UnityPlatform(exclude = new[] {RuntimePlatform.WindowsEditor })]
public void TestMethod2()
{
   Assert.AreNotEqual(Application.platform, RuntimePlatform.WindowsEditor);
}

특정 플랫폼에서만 에디터 테스트를 실행하려는 경우 UnityPlatform을 사용할 수도 있습니다.

PrebuildSetupAttribute

테스트를 시작하기 전에 추가 설정이 필요하다면 PrebuildSetupAttribute를 사용해야 합니다. 이를 위해서는 IPrebuildSetup 인터페이스를 구현하는 클래스 타입을 지정해야 합니다. 클래스 전체에 설정 코드를 실행하려는 경우(예를 들어 에셋 준비나 특정 테스트에 필요한 설정 등 일부 코드를 테스트 시작 전에 실행하고 싶은 경우) IPebuildSetup 인터페이스를 테스트 클래스에 구현해야 합니다.

public class TestsWithPrebuildStep : IPrebuildSetup
{
    public void Setup()
    {
        // Run this code before the tests are executed
    }

    [Test]
    //PrebuildSetupAttribute can be skipped because it's implemented in the same class
    [PrebuildSetup(typeof(TestsWithPrebuildStep))]
    public void Test()
    {
        (...)
    }
}

Play 모드 진입이나 플레이어 빌드 전에 IPrebuildSetup 코드를 실행해야 합니다. 설정 시 UnityEditor 네임스페이스와 함수를 사용할 수 있지만, 컴파일 오류를 피하려면 Editor 폴더에 배치하거나 #if UNITY_EDITOR 지시문으로 보호해야 합니다.

LogAssert

Unity가 일반 로그 또는 경고 메시지 이외의 메시지를 기록하면 테스트가 실패합니다. LogAssert 클래스를 사용하여 로그에서 메시지를 예상할 수 있도록 만들면 Unity가 해당 메시지를 기록할 때 테스트가 실패하지 않습니다.

예상된 메시지가 나타나지 않거나, Unity가 일반 로그 또는 경고 메시지를 기록하지 않는 경우에도 테스트가 실패로 보고됩니다.

예제

[Test]
public void LogAssertExample()
{
    //Expect a regular log message
    LogAssert.Expect(LogType.Log, "Log message");
    //A log message is expected so without the following line
    //the test would fail
    Debug.Log("Log message");
    //An error log is printed
    Debug.LogError("Error message");
    //Without expecting an error log, the test would fail
    LogAssert.Expect(LogType.Error, "Error message");
}

MonoBehaviourTest

MonoBehaviourTest코루틴이면서 MonoBehaviour 테스트 작성을 위한 헬퍼입니다. UnityTest 속성에서 MonoBehaviourTest를 생성하여 지정된 MonoBehaviour를 인스턴스화한 후 실행이 완료될 때까지 기다리십시오. IMonoBehaviourTest 인터페이스를 구현하면 테스트 종료 시점이 표시됩니다.

예제

[UnityTest]
public IEnumerator MonoBehaviourTest_Works()
{
    yield return new MonoBehaviourTest<MyMonoBehaviourTest>();
}

public class MyMonoBehaviourTest : MonoBehaviour, IMonoBehaviourTest
{
    private int frameCount;
    public bool IsTestFinished
    {
        get { return frameCount > 10; }
    }

     void Update()
     {
        frameCount++;
     }
}

플랫폼에서 테스트 실행

Play 모드로 특정 플랫폼에서 테스트를 실행할 수 있습니다. 타겟 플랫폼은 항상 빌드 설정(메뉴: File > Build Settings)에서 선택한 현재 플랫폼입니다. Run all in the player 를 클릭하여 현재 활성화된 타겟 플랫폼에서 테스트를 빌드하고 실행하십시오.

현재 플랫폼은 버튼에 괄호로 표시됩니다. 예를 들어 아래 스크린샷에서 현재 플랫폼이 Windows이므로 버튼은 Run all in player (StandaloneWindows) 를 읽습니다.

테스트 결과는 테스트가 완료된 후 빌드에 표시됩니다.

테스트 결과를 플랫폼에서 테스트를 실행 중인 에디터로 보내려면 플랫폼과 에디터가 모두 같은 네트워크에 있어야 합니다. 플랫폼에서 실행 중인 애플리케이션은 테스트 결과를 다시 보고하고 실행된 테스트를 표시하고 종료됩니다.

단, 일부 플랫폼은 Application.Quit를 통한 애플리케이션 종료를 지원하지 않습니다. 이러한 애플리케이션은 테스트 결과를 보고한 후에도 계속 실행됩니다.

Unity가 연결을 인스턴스화할 수 없는 경우 실행 중인 애플리케이션에서 테스트가 성공하는 것을 확인할 수 있습니다. 이 상태에서 인수를 사용하여 플랫폼에서 실행되는 테스트는 XML 테스트 결과를 제공하지 않습니다.

커맨드 라인에서 실행

이를 위해서는 다음 커맨드 라인인수로 Unity를 실행해야 합니다.

  • runTests - 프로젝트에서 테스트를 실행합니다.

  • testPlatform - 테스트를 실행할 플랫폼입니다.

  • testResults - Unity가 결과 파일을 저장하는 위치를 표시하는 경로입니다. 기본적으로 Unity는 프로젝트의 루트 폴더에 결과 파일을 저장합니다.

예제

다음 예제는 Windows에서의 커맨드 라인 인자를 보여줍니다. 특정 라인은 운영체제에 따라 다를 수 있습니다.

>Unity.exe -runTests -projectPath PATH_TO_YOUR_PROJECT -testResults C:\temp\results.xml -testPlatform editmode

팁: Windows에서 실행된 커맨드의 결과 코드를 읽으려면 다음을 실행하십시오.

start /WAIT Unity.exe ARGUMENT_LIST.

비교 유틸리티

UnityEngine.TestTools.Utils 네임스페이스에는 NUnit 제약을 사용하여 Vector2, Vector3, Vector4, Quaternion, Colorfloat 타입을 비교할 수 있는 유틸리티 클래스가 포함되어 있습니다.


Unity Test Runner
C# 컴파일러