로우 레벨 테스트(Low-Level Tests, LLT) 프레임워크는 다음 두 가지 타입의 테스트를 인식합니다.
- 명시적(Explicit): 모듈 빌드-타깃 쌍으로 정의된 독립형 테스트입니다.
- 묵시적(Implicit): 테스트 모듈 내부에 존재하며 빌드-타깃 쌍이 필요 없는 테스트입니다.
명시적 테스트
명시적 테스트 는 모듈 빌드-타깃 쌍으로 정의된 독립형 테스트입니다. 명시적 테스트는 컴파일 시간과 실행 시간 측면에서 부담이 없도록 설계되었습니다. 명시적 이라고 하는 이유는 명시적인 UE 모듈과 타깃 파일이 필요하기 때문입니다. 반면, 묵시적 테스트에는 명시적인 UE 모듈과 타깃 파일이 필요 없습니다. 그러므로 명시적 테스트에는 .Build.cs 파일과 .Target.cs 파일이 모두 필요하지만, 묵시적 테스트에는 필요 없습니다. 명시적 테스트와 묵시적 테스트의 차이점에 대한 자세한 내용은 묵시적 테스트 섹션을 참조하세요.
명시적 테스트 생성
다음 단계를 따라 명시적 테스트를 생성합니다.
-
Source/Programs디렉터리에서 테스트하려는 모듈과 같은 이름으로 새 디렉터리를 생성하고, 이 디렉터리에.Build.cs파일을 추가합니다.예시를 확인하려면,
Engine/Source/Programs/LowLevelTests디렉터리에 파운데이션 테스트(Foundation Tests)라는 이름의 명시적 테스트 타깃이 포함되어 있습니다. TestModuleRules에서 모듈 클래스를 상속합니다.- 플러그인용 테스트를 작성 중이라면, 플러그인의
Source디렉터리와 같은 레벨에 있는Tests디렉터리 안에 새 모듈을 배치합니다. - Catch2를 사용하지 않는 테스트 모듈을 빌드 중이라면, 두 번째 파라미터를 false로 설정한 상태로 베이스 생성자를 상속합니다.
base(Target, false).
- 플러그인용 테스트를 작성 중이라면, 플러그인의
- 새
Metadata오브젝트 실행인자와 함께UpdateBuildGraphPropertiesFile을 호출합니다.- 이 정보는 BuildGraph 스크립트 테스트 메타데이터를 생성하는 데 사용됩니다.
- BuildGraph 스크립트 생성에 대한 자세한 내용은 BuildGraph 스크립트 메타데이터 생성 섹션을 참조하세요.
-
UEModuleTests라는 명시적 테스트 모듈이 있다고 가정해보겠습니다. 명시적 테스트.Build.cs파일은 다음과 같은 모습입니다.UEModuleTests/UEModuleTests.Build.cs
public class UEModuleTests : TestModuleRules { public UEModuleTests(ReadOnlyTargetRules Target) : base(Target) { PrivateIncludePaths.AddRange( // 모든 프라이빗 포함 경로 ); PrivateDependencyModuleNames.AddRange( // 링크할 모든 프라이빗 종속성 ); // 기타 타입의 종속성 또는 모듈별 로직 UpdateBuildGraphPropertiesFile(new Metadata("UEModule", "UE Module")); } } TestTargetRules에서 상속하는 클래스가 포함된 테스트 타깃 파일('.Target.cs` )을 추가합니다.- 필요한 경우 디폴트 컴파일 플래그를 오버라이드합니다.
- 로우 레벨 테스트에 값을 추가하지 않는 디폴트 기능이 없는 최소한의 테스트 가능 모듈을 목표로 합니다.
- 지원되는 플랫폼을 개별적으로 지정할 수 있습니다. 디폴트 플랫폼은 Win64, Mac, Linux, Android입니다.
- 프로젝트별 글로벌 정의를 활성화하고, 벤치마킹 지원에 필요한 정의 등의 Catch2 정의를 설정할 수 있습니다.
-
명시적 테스트
.Target.cs파일은 다음과 같은 모습입니다.UEModuleTests/UEModuleTests.Target.cs
[SupportedPlatforms(UnrealPlatformClass.All)] public class UEModuleTestsTarget : TestTargetRules { public UEModuleTestsTarget(TargetInfo Target) : base(Target) { // 다른 타깃과 마찬가지로 컴파일 플래그, 글로벌 정의 등을 설정합니다. GlobalDefinitions.Add("CATCH_CONFIG_ENABLE_BENCHMARKING=1"); } }
다음 단계
이제 모듈의 Private 폴더에서 C++ 테스트 파일을 작성하고 이러한 테스트 파일에 Catch2 테스트를 작성할 수 있습니다. 테스트 팁과 모범 사례는 로우 레벨 테스트 작성 문서를 참조하세요. 마지막으로, 테스트를 빌드하고 실행하는 방법을 알아봅니다. 로우 레벨 테스트를 빌드하고 실행하는 방법은 여러 가지입니다. 로우 레벨 테스트 빌드 및 실행 문서를 참조하여 개발에 필요한 최적의 메서드를 선택하세요.
BuildGraph 스크립트 메타데이터 파일 생성
BuildGraph로 테스트를 빌드하고 실행하려는 경우, 명시적 테스트에 대한 BuildGraph 스크립트 메타데이터 파일의 생성을 활성화해야 합니다. GenerateProjectFiles.bat 를 통해 IDE 솔루션을 생성하면 명시적 테스트 모듈이 BuildGraph .xml 파일을 생성합니다.
엔진 환경설정 세팅은 이러한 생성 조건을 설정합니다. Engine/Config/BaseEngine.ini 에서 이 환경설정을 설정할 수 있습니다.
[LowLevelTestsSettings]
bUpdateBuildGraphPropertiesFile=true
GenerateProjectFiles.bat 를 실행하면, 테스트 메타데이터 .xml 파일이 각 테스트 타깃의 Build/LowLevelTests/<TEST_NAME>.xml 폴더에 생성되며, 여기서 <TEST_NAME> 은 테스트 타깃의 이름입니다. NDA 플랫폼의 경우, 이러한 파일이 Platforms/<PLATFORM_NAME>/Build/LowLevelTests/<TEST_NAME>.xml 아래에 생성됩니다. 추가적인 General.xml 파일이 글로벌 프로퍼티를 포함하는 테스트 파일 옆에 선택적으로 존재합니다.
이 파일이 이미 있다면, C#으로 설명된 Metadata 오브젝트에 따라 업데이트됩니다. 프로젝트 파일 생성에 의해 액세스되는 폴더와 파일은 쓰기가 가능해야 합니다. 일반적으로 이러한 파일은 소스 컨트롤 상황에서는 읽기 전용이므로 생성 전에 확인하거나 쓰기 가능으로 설정해야 합니다.
예시를 확인하려면, Engine/Build/LowLevelTests 디렉터리에 파운데이션(Foundation)이라는 .xml 파일이 있습니다. 이 파일은 파운데이션 테스트를 위해 생성된 BuildGraph 메타데이터입니다.
명시적 테스트 레퍼런스
테스트 모듈 규칙 레퍼런스
TestModuleRules 클래스는 UpdateBuildGraphPropertiesFile 을 사용하여 ModuleRules 를 확장합니다. UpdateBuildGraphPropertiesFile 은 BuildGraph 테스트 메타데이터 .xml 파일을 생성하는 Metadata 오브젝트를 허용합니다. Metadata 오브젝트를 사용하여 다음과 같은 프로퍼티를 설정할 수 있습니다.
| 필드 | 설명 |
|---|---|
TestName |
테스트별 프로퍼티를 생성하기 위해 BuildGraph 스크립트가 사용하는 테스트 이름입니다. 이 필드에는 공백을 사용할 수 없습니다. |
TestShortName |
빌드 시스템에서 표시하기 위해 사용하는 테스트의 약식 이름입니다. 이 필드에는 공백을 사용해도 됩니다. |
ReportType |
Catch2 리포트 타입입니다. 가장 일반적인 리포트 타입은 콘솔과 xml입니다. Catch2 리포트 타입에 대한 자세한 내용은 외부 Catch2 문서를 참조하세요. |
Disabled |
테스트 비활성화 여부입니다. true인 경우 이 테스트는 BuildGraph 그래프에서 제외됩니다. |
InitialExtraArgs |
RunLowLevelTests 건틀릿(Gauntlet) 명령의 다른 실행인자 앞에 붙는 명령줄 실행인자입니다. 이 보통 실행인자는 일부 테스트에만 적용되는 건틀릿 기능 활성화 실행인자입니다. 예를 들어, -printreport 는 테스트 실행이 끝나면 리포트를 stdout 에 출력합니다. |
HasAfterSteps |
true인 경우 테스트는 테스트 실행 후에 시작해야 하는 클린업 또는 단계를 포함하는 <TEST_NAME>AfterSteps 이름이 포함된 BuildGraph Macro 를 제공해야 합니다. 예를 들어, 이 프로퍼티를 사용하여 나머지 테스트 데이터베이스를 정리하는 데이터베이스 스크립트를 실행할 수 있습니다. |
UsesCatch2 |
이 프로퍼티를 사용하여 테스트 프레임워크를 선택할 수 있습니다. 어떤 테스트는 Catch2를 사용하지 않고 GoogleTest 등을 사용할 수 있습니다. 자체 테스트 프레임워크를 선택한 경우, RunLowLevelTests 건틀릿 명령으로 보고 및 기타 기능을 지원하도록 구현해야 합니다. |
PlatformTags |
플랫폼별 태그 목록입니다. 예를 들어, 이 프로퍼티를 사용하여 주어진 플랫폼에서 지원되지 않는 테스트를 제외합니다. |
PlatformCompilationExtraArgs |
플랫폼에서 필요할 수 있는 모든 추가 컴파일 실행인자입니다. |
PlatformsRunUnsupported |
예외를 추가하고 실행 지원이 구현될 때까지 BuildGraph 스크립트에서 컴파일 안전망 역할을 할 수 있습니다. 예를 들어, 플랫폼이 컴파일만 지원하고 로우 레벨 테스트 실행 능력은 부족한 경우입니다. |
TestModuleRules 는 베이스 클래스 ModuleRules 의 많은 디폴트 UBT 플래그를 오버라이드합니다. 이렇게 하면 과대한 컴파일이 줄어들고 대부분의 테스트에 대한 컴파일 시간이 바로 최소화됩니다. TestModuleRules 파생 클래스에서 이러한 디폴트를 항상 오버라이드할 수 있지만, TestModuleRules 에서 직접 변경하면 안 됩니다.
테스트 타깃 규칙 레퍼런스
TestTargetRules 클래스는 다음 플래그를 사용하여 TargetRules 를 확장합니다.
| 플래그 | 설명 |
|---|---|
bUsePlatformFileStub |
이 플래그는 IO 작업을 비활성화하는 모의 인스턴스로 플랫폼 종속적인 FPlatformFile 런타임 인스턴스를 대체합니다. 이 플래그를 사용하면 엔진 모듈에 대해 테스트할 때 에셋 로딩을 비활성화합니다. 이 프로퍼티를 설정하면 추가 IO 모의를 수행하기 위해 테스트에서 사용할 수 있는 |
bMockEngineDefaults |
엔진 모듈로 테스트할 때, 특정 리소스는 기본적으로 관리되거나 에셋 파일에서 로드됩니다. 이러한 작업에는 에셋 쿠킹이 필요합니다. 에셋을 로드하지 않아도 되는 테스트에 이 플래그를 사용하면 엔진 디폴트 머티리얼, 월드 오브젝트나 기타 리소스를 모의하는 효과가 나타납니다. 이 프로퍼티를 설정하면 |
bNeverCompileAgainstEngine |
LLT 프레임워크의 기본 동작은 엔진 모듈이 빌드 종속성 그래프에 있을 때마다 자동으로 bCompileAgainstEngine = true 를 설정하는 것입니다. 이 프로퍼티는 엔진 모듈이 그래프에 있더라도 엔진으로 컴파일하지 않도록 이 동작을 중지할 수 있습니다. |
bNeverCompileAgainstCoreUObject |
bNeverCompileAgainstEngine 과 같지만 CoreUObject 용입니다. |
bNeverCompileAgainstApplicationCore |
bNeverCompileAgainstEngine 과 같지만 ApplicationCore 용입니다. |
bNeverCompileAgainstEditor |
bNeverCompileAgainstEngine 과 같지만 UnrealEd 용입니다. |
bWithLowLevelTestsOverride |
설정 시 종속 모듈의 묵시적 테스트를 포함합니다. 보통 묵시적 테스트용으로 예약된 'WITH_LOW_LEVEL_TESTS' 매크로를 'true'로 강제 설정합니다. |
TestModuleRules 와 마찬가지로 TestTargetRules 는 디폴트 UBT 플래그를 설정합니다. 특히 UObject, 현지화, 통계 등의 UE 기능을 비활성화합니다.
엔진 테스트
이 타입의 명시적 테스트에서 LLT 프레임워크는 엔진 모듈이 포함된 명시적 테스트를 컴파일하고 실행합니다. 에셋을 로드하려면 대부분의 플랫폼에 쿠킹이 필요하기 때문에 엔진 모듈을 사용할 수 없습니다. 따라서 엔진 테스트는 .Target.cs 파일에 다음 플래그가 설정된 경우에만 작동합니다.
public UEModuleTestsTarget(TargetInfo Target) : base(Target)
{
bUsePlatformFileStub = true;
bMockEngineDefaults = true;
}
묵시적 테스트
묵시적 테스트는 테스트하려는 모듈에 존재합니다. 모든 묵시적 테스트는 WITH_LOW_LEVEL_TESTS 정의를 통해 조건부로 컴파일됩니다. Private 폴더 등 모듈의 어느 곳에나 배치할 수 있지만, 모듈 소스 코드와 구분하기 어려울 수 있습니다. 테스트를 쉽게 찾으려면 다음과 같은 규칙을 따르세요.
- 모듈에서 Public 폴더 및 Private 폴더와 같은 레벨에 Tests 폴더를 생성합니다.
- 소스 파일과 일치하는 테스트가 있을 때마다 Tests 내에서 모듈의 폴더 구조를 미러링합니다.
명시적 테스트에 필요한 명시적 타깃이 없으므로 이러한 테스트에는 빌드할 기존 타깃이 필요합니다. 이를 위해서는 묵시적 테스트가 언리얼 빌드 툴을 사용하여 묵시적 테스트용 테스트 실행파일을 생성해야 합니다. 자세한 내용은 로우 레벨 테스트 빌드 및 실행 문서의 묵시적 테스트 빌드 섹션을 참조하세요.
디렉터리 구조
SampleModule 이라는 모듈과 다음 디렉터리 구조를 사용하는 예시는 다음과 같습니다.
.
└── SampleModule/
├── Public/
│ └── SampleCode.h
└── Private/
├── SampleCode.cpp
└── SampleModuleSubDirectory/
├── MoreSampleCode.h
└── MoreSampleCode.cpp
이 모듈에 묵시적 테스트를 추가하려면, Public 디렉터리 및 Private 디렉터리와 같은 레벨에 Tests 디렉터리를 생성하고 Private 의 디렉터리 구조를 미러링합니다. C++ 파일마다 상대적으로 같은 위치에 테스트 파일을 생성합니다. 그 결과, 다음과 같은 구조가 생깁니다.
.
└── SampleModule/
├── Public/
│ └── SampleCode.h
├── Private/
│ ├── SampleCode.cpp
│ └── SampleModuleSubDirectory/
│ ├── MoreSampleCode.h
│ └── MoreSampleCode.cpp
└── Tests/
├── SampleCodeTests.cpp
└── SampleModuleSubDirectory/
└── MoreSampleCodeTests.cpp
이 구조를 사용하면 SampleCodeTests.cpp 파일에는 SampleCode.cpp 파일용 테스트가 포함되고, MoreSampleCodeTests.cpp 파일에는 MoreSampleCode.cpp 파일용 테스트가 포함됩니다.
다음 단계
현재 필요에 맞는 테스트를 결정한 다음에는 로우 레벨 테스트 작성 문서를 참조하여 언리얼 엔진에서 로우 레벨 테스트를 작성하는 방법을 알아보세요.