펑셔널 테스트

펑셔널 테스팅 프레임워크입니다.

Windows
MacOS
Linux

테스트 생성

테스트 설정은 레벨에 AFunctionalTestFunctional Test (펑셔널 테스트) 액터를 배치하면 됩니다. 그런 다음 그 액터에 레벨 블루프린트레벨 스크립트 로 테스트 세트를 실행하는 스크립트를 작성합니다. 테스트 자체는 펑셔널 테스트 액터 안에 (자손 블루프린트 클래스 또는 블루프린트로) 만들어 넣거나 레벨 스크립트에서 직접 조립할 수 있습니다.

FunctionalTest_LevelBP.png

자리표시자 펑셔널 테스트를 실행하는 레벨 블루프린트.

펑셔널 테스트 클래스 피처

Functional Test (펑셔널 테스트) 클래스가 제공하는 중요 함수는 다음과 같습니다.

함수 이름

설명

PrepareTest

코드 또는 블루프린트 자손 클래스에서 오버라이드할 수 있습니다. 이 함수는 OnTestPrepare 델리게이트와 함께 처음 실행되며, 오버라이드를 통해 테스트에 필요한 초기 설정을 할 수 있습니다. 이 설정에 여러 프레임이 필요한 경우, 예를 들면 스트리밍 데이터를 레벨에 로드하거나, 경로 데이터를 빌드하거나, 서버에 접속하거나 하는 경우, 이 함수로 그 프로세스를 시작해야 합니다.

IsReady

PrepareTest 첫 호출 이후 OnTestStart 를 실행할 때까지 매 틱마다 호출되는 함수입니다. 기본적으로 이 함수는 true 를 반환하며, OnTestStarted 를 즉시 호출할 수 있도록 허용합니다. PrepareTest 로 설정한 초기화 프로세스가 불완전하다면, 이 함수는 false 를 반환하여 메인 테스트 코드가 미숙한 상태로 시작하는 것을 막아야 합니다.

OnTestStart

이 델리게이트는 Functional Testing Manager (펑셔널 테스팅 매니저)가 테스트를 시작할 때 호출됩니다. 테스트 함수 기능에 바인딩하고 마지막에 FinishTest 호출하면 됩니다.

OnTestFinished

테스트가 끝나면 이 델리게이트가 호출됩니다. 테스트는 종종 후속 테스트에 영향을 주는 방식으로 레벨 내 액터나 레벨에 영향을 주므로, 이 기회에 정리(clean up)하는 것이 사용 가능한 테스팅 환경을 유지하는 데 매우 중요합니다.

Functional Test 클래스는 다음과 같은 기능도 지원합니다.

함수 또는 프로퍼티 이름

설명

OnAdditionalTestFinishedMessageRequest

OnAdditionalTestFinishedMessageRequest 를 구현하면 테스트 요약 로그에 정보를 추가하는 방법으로 유용합니다.

RegisterAutoDestroyActor

이 함수에 전달한 액터는 테스트가 끝나면 자동 소멸됩니다. 테스트의 일부로 스폰된 액터를 정리하는 좋은 방법입니다.

LogMessage

출력 로그LogFunctionalTest 카테고리에 제공한 텍스트를 출력하는 함수입니다. 원래 의도는 테스트 실행 동안 진행 상황을 기록하기 위해서입니다.

Observation Point

액터를 이 프로퍼티에 할당하면, 테스트 시작 시 이 위치로 플레이어를 이동하고 회전합니다.

Enabled

이 변수를 false 로 설정하면 테스트를 비활성화합니다.

레벨 스크립트를 통한 테스트

레벨 스크립트에서 펑셔널 테스트를 실행하려면, 먼저 레벨에 Functional Test (펑셔널 테스트) 액터를 배치합니다. 펑셔널 테스트를 선택한 채 레벨 스크립트를 열고 OnTestStart 델리게리트와 펑셔널 테스트로의 레퍼런스를 배치합니다. 펑셔널 테스트의 핀을 끌어 놓아 FinishTest 노드를 하나 이상 만들 수 있습니다. 이 시점에서 테스트를 빌드하여 OnTestStart 델리게이트가 FinishTest 노드(들)에 연결되도록 합니다. 정리가 필요한 작업을 하는 테스트의 경우 OnTestFinished 함수도 생성해야 할 수 있습니다. 이 설정이 끝나면 Automation System (자동화 시스템)에서 이 테스트를 올바르게 실행할 수 있습니다. 이 방법은 간단한 테스트, 일반적으로 설정이 거의 필요 없는 테스트에 적합하며, 여러 번 또는 여러 레벨에서 실행하지 않아도 됩니다.

레벨 스크립트에 (펑셔널 테스트 액터와 같은) 액터로의 레퍼런스 또는 이벤트를 추가하려면, 그 액터를 레벨 에디터 또는 월드 아웃라이너 에서 선택한 상태여야 합니다.

자손 클래스 메서드를 통한 테스트

펑셔널 테스트에 보다 복잡한 설정이 필요하거나 (단일 레벨에서, 아니면 여러 레벨에서) 여러 번 실행해야 하는 경우, AFunctionalTest 오버라이드를 권장합니다. 코드나 블루프린트에서 기본 Functional Test 클래스를 확장하면 PrepareTestIsReady 함수를 사용할 수 있는데, 복잡 또는 내부 종속성이 있는 테스트나 설정 시간이 여러 프레임인 테스트를 실행할 때 중요합니다. 레벨 스크립트를 통한 이러한 테스트의 구현은 이전과 동일하지만 테스트 스크립트의 대다수가 레벨 스크립트가 아닌 새로운 기능 테스트 클래스 자체에 포함될 수 있으므로 여러 레벨에서 한 번, 또는 같은 레벨에서 여러 번 쉽게 테스트할 수 있습니다.

예상 테스트 결과 생성 및 사용

어떤 테스트 결과는 크고 복잡하고 정교하거나 수동 작성한 솔루션에 적합하지 않을 수 있습니다. 이와 같은 경우 일반적으로 단일 테스트를 실행하고, 결과가 올바른지 개인적으로 확인한 다음, 결과를 저장하여 향후 테스트 결과와 비교할 수 있습니다. 이는 Functional Testing Editor (펑셔널 테스팅 에디터) 플러그인에 Ground Truth Data (실측 기반 데이터)라는 개념으로 구현되었습니다.

FunctionalTest_Plugin.png

펑셔널 테스트 에디터 플러그인을 활성화해야 실측 기반 데이터를 사용할 수 있습니다.

UGroundTruthData 클래스에 구현된 실측 기반 데이터 개념은 결과를 저장하고 비교하는 데 사용됩니다. 실측 기반 데이터 오브젝트는 선택한 오브젝트를 앞으로 하려는 테스트의 "올바른" 결과로 저장합니다. 그리고 이 오브젝트를 라이브 시뮬레이션에서 해당 오브젝트와 원하는 방식으로 비교할 수 있습니다. 그런 다음 로직으로 테스트 통과 또는 실패 여부를 결정할 수 있습니다. 예를 들어, 골프 게임처럼 정교하고 신뢰할 수 있는 물리 시뮬레이션이 필요한 경우, 시뮬레이션 플레이어가 홀인원을 치는 테스트가 있을 수 있습니다. 실측 기반 데이터에 골프 공을 오브젝트로 포함하고, 라이브 시뮬레이션의 골프 공 위치를 기존에 저장한 (즉 구멍에 들어간) 위치와 비교하여, 오차를 아주 조금만 허용하면 실패 없이 테스트할 수 있습니다. 이런 테스트는 다음과 같이 설계할 수 있습니다.

  • 특정 위치와 초기 속도로 "테스트" 골프 공을 스폰합니다. 일정한 여행 시간을 줍니다. 이 시점에서 골프 공은 이상적인 위치에 있을 것입니다. 이제 이 테스트의 실측 기반 데이터에서 골프 공의 "올바른" 위치 로드를 시도할 수 있습니다.

  • 실측 기반 데이터가 허용되는 오브젝트를 반환하지 않는 (예를 들어 반환된 오브젝트가 null 또는 잘못된 클래스인) 경우, 생성한 테스트 골프 공을 실측 기반 데이터에 예상 결과로 저장합니다. 골프 공이 있어야 할 곳에 착지하지 못한 경우, 실측 기반 데이터는 블루프린트에서 그 ResetGroundTruth 변수를 false 설정하여 언제든 수동 리셋할 수 있습니다.

    블루프린트 에디터에서 ResetGroundTruth 박스를 체크하면 바로 체크가 해제되지만 데이터는 리셋됩니다.

  • 실측 기반 데이터가 원하는 클래스로 변환할 수 있는 오브젝트를 반환한 경우 (이 예에서는 Actor 면 충분), 그 오브젝트와 테스트 골프 공을 비교하여 테스트 통과 여부를 평가할 수 있습니다. GroundTruthExample.png

    이 테스트는 이동 시간이 4 초인 "테스트 골프 공"의 일관된 위치를 확인합니다.

    이런 식으로 설정한 테스트는 같은 스크립트로 테스트를 실행하고 예상 테스트 결과를 설정할 수 있습니다. 예상 테스트 결과는 에디터에서 실측 기반 데이터를 편집하여 리셋시킬 수 있습니다.

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback