TDD(Test Driven Development)

최근에 읽고 있는 책에서 테스트 코드의 중요성에 대해서 나와서 유니티에서 유닛테스트를 해볼려고 한다.

유니티에서 테스트코드를 작성하기 위해선 우선 유니티에서 어셈블리의 개념에 대해 알아야 한다.

Assmbly

유니티에서 어셈블리의 개념은 간단하게 해당 스크립트를 한 곳에 묶어두는 역할을 한다.

자바의 패키지와 같은 개념으로 컴파일 단계또한 다르게 이루어진다.

즉, class를 NameSpace로 구분하여 다르게 가리키는 것이 아닌 완전히 다른 영역이라고 생각하면 된다.

이것을 잘 활용하면 모듈화, 재사용성을 높일 수 있다.

한 어셈블리에 코드가 너무 몰리게 되면 컴파일 속도가 느려진다.

  1. 하나의 스크립트를 변경할 때마다 Unity는 다른 모든 스크립트를 다시 컴파일해야 하므로 반복적 코드 변경을 위한 전체 컴파일 시간이 늘어납니다
  2. 모든 스크립트는 다른 스크립트에서 정의된 타입에 직접 액세스할 수 있으므로 코드를 리팩터링하고 개선하기가 더 어려울 수 있습니다.
  3. 모든 스크립트는 모든 플랫폼에 대해 컴파일됩니다.

이러한 문제점을 어셈블리가 해결가능하다.

이미지

기본적으로 생성되는 Assembly-CSharp, Assembly-Csharp-Editor를 제외한 두개의 어셈블리는 사용자 정의 어셈블리이다.

이외에도 스크립팅, 에셋 번들링, 플러그인, 네트워크등에 사용된다..

생성 방법

이미지

이미지

생성하게 되면 되게 많은 정보가 있는데 간단하게 알아보자

사용자 정의 어셈블리를 생성하면 지금과 같이 아무런 참조가 없이 영역을 지정하게 되고 solution탭에서 보듯이 영역이 나누어지게 된다.

해당 영역의 코드는 자식까지 다 참조하기 때문에 생성된 어셈블리 폴더를 기준으로 한다.

이와 반대로 유니티에서 TestRunner를 통한 생성은 조금 다른 걸 알 수 있다.

이미지

이미지

자세히 보면 자동으로 nunit.framework.dll , UnityEngine.TestRunnerUnityEditor.TestRunner 어셈블리 에 대한 참조가 있음을 알 수 있다.

Test Runner

TestRunner의 scripts 생성 버튼을 누르면 기본적인 Testcode 스크립트를 생성해준다.

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

public class NewTestScript
{
    // A Test behaves as an ordinary method
    [Test]
    public void NewTestScriptSimplePasses()
    {
    }

    // 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()
    {
        yield return null;
    }
}

테스트 코드의 형태는 다음과 같다.

[Test] 애트리뷰트는 단순 기능정도의 테스트를 할 수 있다.

[UnityTest] 여러 테스트를 절차적으로 진행하면서 테스트한다.(코루틴으로 동작)

Assert클래스를 사용

이미지

Editor_SandBox: 현재 프로젝트 Tests.dll: 아까 생성한 어셈블리 영역 NewTestScript: TestRunner에서 생성해준 테스트 스크립트 즉, 해당 영역에서 다른 테스트 코드 스크립트를 생성하면 여기영역에 추가된다. NewTest..: 해당 스크립트에 들어있는 [Test]계열 애트리뷰트 함수들

더블 클릭으로 해당 메서드를 테스트할 수 있고 Run All을 통해 전체 테스트도 가능하다.

Run All Tests를 통해 전체 기능 테스트 가능(플랫폼까지)

앞서 어셈블리 파일 아래에 Plafroms에서 설정이 가능하다.

++

다른 영역의 코드를 참조하고 싶으면 앞서 다룬 Assembly Definition Reference영역에 참조하고 싶은 영역의 어셈블리를 넣어주면 된다.

즉, 테스트를 위한 영역과 각 테스트를 위한 영역을 따로 불러와야 하는 것

가장 간단한 방법은 root에 영역을 지정하여 등록한다.


  • https://docs.unity3d.com/kr/2021.3/Manual/ScriptCompilationAssemblyDefinitionFiles.html
  • https://docs.unity3d.com/Packages/com.unity.test-framework@2.0/manual/workflow-create-test-assembly.html

태그: ,

카테고리:

업데이트:

댓글남기기