Unity

유니티 테스트 러너 사용방법

Dean83 2022. 3. 25. 09:21

1. Test Runner 세팅법
    - Project -> 마우스 우클릭 -> Create -> Testing -> Play/Edit test 스크립트 추가
    - 상단 메뉴 -> Window -> Test runner 실행 -> playmode/ editmode에 추가한 스크립트 내용이 있음. 
    - 스크립트 작성시, Assert를 사용하여 equal, IsTrue 등등을 이용하여 검증
      - 함수명 위에 [test] 적어주면 됨, [UnityTest]는 코루틴 함수용
    - Test runner 에서 Run all 혹은 run selected를 통해 테스트 할 수 있음.
      - 실패시 실패한 이유를 찾아 수정 -> 재 테스트

* 관건은 테스트 코드를 어떻게 짤것인지가 관건인데....영상재생씬 테스트 코드 작성을 위해서는 많은 회의가 필요할듯. 테스트 코드를 돌리기 위해 원본 코드를 수정할 일이 많을듯. 

2. Unity Test에 사용되는 Assert 클래스 함수들
    - Assert.AreApproximatelyEqual(A,B) : A, B가 대략적으로 동일한지. (소수점에서 사용)
      - 기본 허용치는 0.00001f
      - 함수가 총 4개 존재
         - float 예상값, float 실제값
         - float 예상값, float 실제값, string 설명메세지
         - float 예상값, float 실제값, float 허용치
         - float 예상값, float 실제값, float 허용치, string 설명메세지
    - Assert.AreEqual (A,B) : A, B가 동일한지.
    - Assert.AreNotApproximatelyEqual : A, B가 대략적으로 동일하지 않은지. (소수점에서 사용) 위의 AreApproximatelyEqual 과 반대개념
    - Assert.AreNotEqual (A,B) : A, B가 같지 않은지.
    - Assert.IsFalse(A) : A가 false인지
    - Assert.IsNotNull(A) : A가 null이 아닌지
    - Assert.IsNull(A) : A가 null인지
    - Assert.IsTrue(A) : A가 true인지

3. Test 를 실행하기 위한 Unity UI 설정 (?)
    - 보통 UI 및 object를 prefab에 저장 -> 테스트 할 때 불러와 배치 후 동작
    - 면접의 신 테스트 코드 같은경우 UI 및 object를 코드에서 생성해야할듯. 
    - 문제는..씬 매니저에 UI를 연결하기 위해 기존 원본 코드 수정이 필요

4. 테스트 코드 작성 팁
    - if, switch, while, for문 등 논리조건을 없애기.
      - 불가피할 경우 테스트 함수를 분리
      - 반복문 혹은 if문 등 정상적인 상황을 예측하여 테스트 코드 작성
    - Setup -> Test run -> result check 3단계로 진행.
       - Setup : 테스트를 실행하기 위해 변수값 등 setting      
    - 테스트 함수의 이름을 명확하게. (한글도 되긴 함)
    - 각 함수 호출시 전달되는 인자값에 또 다른 함수 호출을 하지말것.
      - 함수 호출을 미리 하여 변수에 담아놓고, 변수값을 함수의 인자값으로 전달. 
    - 하드코드 대신 const를 사용하여, 변수 지정 후 테스트코드 작성
    - 가급적 Assert 하나당 하나의 테스트 함수 작성
    - 참조 
       - https://docs.microsoft.com/ko-kr/dotnet/core/testing/unit-testing-best-practices
       - https://4think.tistory.com/entry/%EC%98%AC%EB%B0%94%EB%A5%B8-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%91%EC%84%B1%EB%B2%95?category=343754

5. Mock object 설명
    - 테스트를 위해 임시로 사용되는, 가짜 object를 말한다.
    - void 함수 테스트를 위해 사용되거나 다른 목적에 의해 사용된다.
    - 예 : 기존 class A 를 상속받은 class ATest를 만들고, 테스트 검증에 필요한 코딩을 추가한다.

6. void 함수 테스트 설명
    - void 함수의 경우, 리턴값이 없으므로 결과값을 가지고 테스트 할 수 없다.
    - 함수 내부 동작에 대한 테스트가 수행되어야 한다.
    - 참조 예제 : https://medium.com/@SlackBeck/mock-object%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-85159754b2ac

7. 예제

- 몬스터 최초 health가 100인지 체크
[test]
public void CheckMonsterBasicHealth()
{
      MonsterInfo monster = new MonsterInfo();
      int monsterHealth =  monster.GetHealth();
      const int BasicHealth = 100;
      Assert.AreEqual(monsterHealth , BasicHealth );
}

- 몬스터 때리기가 성공하는지 테스트
[test]
public void MonsterHitTest()
{
      MonsterInfo monster = new MonsterInfo();
      const int hitPoint = 10;
      bool result = monster.HitMonster(hitPoint);
      Assert.IsTrue(result);
}

- 몬스터 때린 후 남은 체력이 계산식과 맞는지 테스트
[test]
public void RemainMonsterHealthTest()
{
      MonsterInfo monster = new MonsterInfo();
      int monsterHealth = monster.GetHealth();
      const int hitPoint = 10;
      bool result = monster.HitMonster(hitPoint);
      int remainHealth = monster.GetHealth();
      Assert.AreEqual(remainHelth, monsterHealth - hitPoint );
}

8. 정리
    - 소위 말하는 MVC 패턴에서 C에 해당하는 command 부분을 위한 테스트
    - UI와 연계되어 있지 않은, 함수 인자값을 입력하였을 경우, 리턴값 혹은 void 함수에 대한 테스트
    - 면접의 신의 경우, DataContainer 같은 스크립트를 위한 테스트 스크립트 작성이 유효할 듯
    - public 함수로 선언해야 테스트가 가능. 최소한 protected는 해야 할듯.