로우 레벨 테스트(Low-Level Tests, LLT) 는 언리얼 엔진에서 모듈 중심의 가벼운 테스트를 실행하는 프레임워크입니다. 로우 레벨 테스트는 Catch2 테스트 프레임워크로 작성되었습니다. UE에서 지원하는 모든 플랫폼에 로우 레벨 테스트를 빌드하고 실행할 수 있습니다. 로우 레벨 테스트에는 다음과 같은 테스트 타입이 포함됩니다.
- 명시적(Explicit): 모듈과 타깃 쌍으로 정의된 독립형 테스트입니다.
- 묵시적(Implicit): 테스트 중인 모듈 내부에 존재하며 모듈과 타깃 쌍이 필요 없는 테스트입니다.
명시적 테스트와 묵시적 테스트 모두 다음 테스트 방법론을 사용할 수 있습니다.
- 유닛(Unit): 독립형 섹션 또는 코드 유닛을 테스트합니다.
- 통합(Integration): 여러 섹션 또는 코드 유닛을 그룹으로 결합하여 테스트합니다.
- 기능성(Functional): 기능이나 사용 사례의 구체적인 기능성을 테스트합니다.
- 스모크(Smoke) 기능이나 사용 사례를 빠르게 검증합니다.
- 엔드 투 엔드(End-to-end): 기능의 여러 스테이지를 테스트합니다.
- 퍼포먼스(Performance): 기능의 실행 시간을 벤치마킹합니다.
- 스트레스(Stress): 시스템에 부담을 가해 기능 중단을 시도합니다.
다음 테스트 패러다임 중 하나를 사용하여 로우 레벨 테스트를 작성할 수 있습니다.
- 테스트 중심 개발(Test-Driven Development, TDD)
- 동작 중심 개발(Behavior-Driven Development, BDD)
로우 레벨 테스트를 사용하는 이유
로우 레벨 테스트가 다른 UE 테스트 프레임워크와 다른 점은 컴파일 및 런타임 리소스를 최소한으로 사용한다는 점입니다. LLT는 다양한 UE 기능과 연동되도록 만들어졌습니다. 그 예로는 UObject, 에셋, 엔진 컴포넌트가 있습니다. 언리얼 엔진의 로우 레벨 테스트는 최신 C++ 테스트 프레임워크인 Catch2로 작성되며, 테스트 그룹화 및 라이프 사이클 이벤트는 물론 언리얼 엔진의 모듈형 아키텍처와 함께 잘 작동하는 다른 기능도 포함하도록 확장되었습니다.
로우 레벨 테스트 문서 가이드
이 페이지의 나머지 부분에서는 몇 가지 일반적인 테스트 방법론을 간략하게 살펴봅니다.
아래는 이 문서에서 다룰 내용의 개요입니다. 빌드 및 실행 문서 섹션은 모든 사용 사례에 공통적으로 해당하는 내용으로, 테스트 실행 방법을 학습하는 데 있어 필수입니다.
언리얼 엔진 로우 레벨 테스트 문서
언리얼 엔진 로우 레벨 테스트 문서에서 다루는 영역은 다음과 같습니다.
Catch2 문서
이 문서에서는 Catch2가 제공하는 기능의 포괄적인 리소스를 제공하지는 않습니다. Catch2에 대한 자세한 내용은 GitHub의 Catch2 저장소를 참조하세요. Catch2에서의 테스트 작성 등 Catch2에 대한 자세한 내용은 Catch2 문서를 참조하세요.
테스트 방법론
이 섹션에서는 로우 레벨 테스트를 통해 구현할 수 있는 여러 가지 테스트 방법을 간략하게 살펴봅니다.
유닛 테스트
유닛 테스트 는 하나의 코드 유닛, 일반적으로 클래스 내의 단일 메서드를 테스트합니다. 이 테스트는 서버나 데이터베이스 같은 외부 종속성 및 모의 입력에 의존합니다. 일반적으로 테스트되는 클래스당 하나의 유닛 테스트 툴세트를 작성합니다. 유닛 테스트의 목표는 클래스의 퍼블릭 인터페이스와 메서드 내의 다양한 코드 경로를 다루는 것입니다.
대부분의 테스트는 유닛 테스트가 아닌데, 그 이유는 작성 방식이 매우 제한적이며, 이렇게 제한적인 방식으로는 타깃 코드를 테스트하지 못할 수 있기 때문입니다. 유닛 테스트는 최소한의 특수 글로벌 구성(모의, 스텁, 페이크 설정)과 해체만 필요하며, 테스트 툴세트마다 독립적으로 실행될 수 있어야 합니다. 유닛 테스트는 다른 유닛 테스트의 순서에 종속되어서는 안 됩니다. 유닛 테스트는 매우 빨라, 실행하는 데 몇 초도 걸리지 않습니다.
통합 테스트
통합 테스트 는 여러 코드 유닛을, 일반적으로 두 개 이상의 클래스 또는 메서드를 함께 테스트합니다. 여기에는 외부 리소스, 모듈 로딩 등의 글로벌 구성이 필요할 수 있습니다. 유닛 테스트보다 덜 제한적이고 더 일반적이긴 하지만, if 조건 같은 코드 분기를 다루기는 어려울 수 있습니다. 통합 테스트는 일반적으로 유닛 테스트보다 느리며, 실행하는 데 최대 몇 초 정도가 걸립니다.
기능성 테스트
기능성 테스트 는 특정 기능, 일반적으로 하나의 기능이나 사용 사례를 테스트합니다. 외부 리소스를 관리하기 위해 해체와 글로벌 구성이 필요한 경우가 많습니다. 기능성 테스트는 가장 일반적인 테스트 타입으로, 테스트마다 복잡한 정도가 매우 다를 수 있습니다. 기능성 테스트는 실행하는 데 몇 초에서 몇 분, 드물게는 몇 시간까지도 걸릴 수 있습니다. 일반적으로 통합 테스트보다 느립니다.
스모크 테스트
스모크 테스트 는 기능이나 사용 사례를 빠르게 검증합니다. 이 테스트는 최소 허용 기준을 다룹니다. 애플리케이션을 실행하는 데 몇 초 정도가 걸리면 애플리케이션 시작 시 실행할 수 있거나 개발 빌드에서 실행할 수 있습니다. 일반적으로 지속적인 통합, 반복작업 빌드에 포함됩니다.
엔드 투 엔드 테스트
엔드 투 엔드 테스트 는 단 하나의 세그먼트가 아닌 기능의 여러 스테이지에 걸쳐 실행됩니다. 완료하는 데 몇 분 이상 걸리는 더 무거운 테스트입니다. 엔드 투 엔드 테스트에는 보통 테스트를 중단할 수 있는 전제 조건이 있는 체크포인트가 있습니다.
퍼포먼스 테스트 및 스트레스 테스트
퍼포먼스 테스트 는 벤치마킹인 경우가 많으며 보통 실행 시간이 깁니다. 스트레스 테스트 는 하나의 기능을 대상으로 하며, 반복 액션이나 시스템에 부담을 주어 그 기능을 중단하려 시도합니다. 두 타입 모두 보통 베이스라인과 비교되는 퍼포먼스 메트릭을 캡처합니다. 두 타입 모두 느리고 보통 완료하는 데 몇 시간이 걸릴 수 있지만, 실행 시간이 얼마여야 하는지에 대한 정해진 규칙은 없습니다. 일부 퍼포먼스 테스트는 몇 초나 몇 분 만에 완료되기도 합니다.
더 알아보기
로우 레벨 테스트 타입
명시적 테스트와 묵시적 테스트 그리고 언리얼 엔진 코드로 이들 테스트를 조직하는 방법을 자세하게 살펴봅니다.
로우 레벨 테스트 작성
일반 가이드라인 및 모범 사례를 포함하여 언리얼 엔진에서 Catch2로 로우 레벨 테스트를 작성하는 방법을 살펴봅니다.
로우 레벨 테스트 빌드 및 실행
Visual Studio, 언리얼 빌드 툴, BuildGraph로 언리얼 엔진에서 로우 레벨 테스트를 빌드하고 실행하는 방법을 살펴봅니다.