You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
169 lines
7.5 KiB
Plaintext
169 lines
7.5 KiB
Plaintext
INTSourceChangelist:2374181
|
|
Availability:Public
|
|
Title:자동화 테크니컬 가이드
|
|
Crumbs: %ROOT%, Programming, Programming/Automation
|
|
Description:새로운 자동화 테스트 생성을 위한 프로그래머 안내서입니다.
|
|
Version: 4.5
|
|
|
|
자동화 테스트는 크게 **Simple** 과 **Complex** 두 가지로 나뉩니다. Simple Test, 단순 테스트는 하나의 원자성
|
|
테스트를 말하는 반면, Complex Test, 복잡 테스트는 다수의 입력에 같은 코드를 돌리는 데 사용됩니다.
|
|
|
|
단순 테스트는 특정 함수성이 의도된 대로 작동하는지 확인하는 데 좋습니다. 이들은
|
|
보통 unit test 또는 feature test 입니다. 예를 들어 단순 테스트가 사용되는 곳은 현재 맵이
|
|
_에디터에서 플레이_ 에 로드되나, Slate 에서 문장 줄바꿈이 잘 돌아가나 테스트할 때 입니다.
|
|
|
|
복잡 테스트는 항목 모음을 대상으로 반복처리하여 각 항목별로 같은 함수성을 수행하기에 좋습니다.
|
|
이들은 보톤 content stress test 입니다. 예를 들어 모든 맵을 로드하거나 모든 Blueprint 컴파일
|
|
등이 복잡 자동화 테스트의 좋은 예입니다.
|
|
|
|
## 아키텍처 그리고 실행
|
|
|
|
모든 자동화 테스트는 `FAutomationTestBase` 클래스에서 파생되는데, 여기서 명령어 집합을 수행하는
|
|
범용 함수성을 정의합니다. 새로운 자동화 테스트 셋업시 사용되는 `FAutomationTestBase` 클래스의
|
|
중요 함수는 다음과 같습니다:
|
|
|
|
| 멤버 함수 | 설명 |
|
|
| --------- | ---- |
|
|
| `GetTests()` | 명령어 목록을 `RunTest()` 에 전달할 파라미터로 하나씩 하나씩 채웁니다. |
|
|
| `RunTest()` | 전달된 명령어 문자열을 사용하여 테스트 로직을 돌립니다. |
|
|
|
|
자동화 테스트 실행에 있어서의 일반적인 흐름입니다:
|
|
|
|
/-----------------\ /--------------\ /---------------\
|
|
| Automation UI | | GetTests() | | RunTest() |
|
|
+-----------------+ +--------------+ +---------------+
|
|
| | | | | |
|
|
| o Start +-------+ o Commands +---+-->+ o Parameters +--\
|
|
| | | | | | | |
|
|
\-----------------/ \--------------/ | \---------------/ |
|
|
| |
|
|
\----------------------/
|
|
|
|
## 디렉토리
|
|
|
|
현재 규칙은 모든 자동화 테스트를 연관성이 있는 모듈 내 `Private\Tests` 디렉토리에 넣는 것입니다.
|
|
테스트가 특정 클래스에 일대일로 대응되면, 테스트 파일 이름을 `[ClassFilename]Test.cpp` 으로 지어주세요.
|
|
|
|
## 테스트 만들기
|
|
|
|
각 자동화 테스트 선언은 특수 매크로를 사용합니다. 매크로는 테스트가 단순 테스트냐 복잡 테스트냐에
|
|
따라 달라지지만, 각 매크로가 필요로 하는 파라미터는 동일합니다:
|
|
|
|
| 파라미터 | 설명 |
|
|
| -------- | ---- |
|
|
| `TClass` | 테스트의 클래스 이름입니다. |
|
|
| `PrettyName` | UI 에 나타날 계층구조식 테스트 이름을 나타내는 문자열입니다. |
|
|
| `TFlags` | 자동화 테스트 요건/동작을 나타내는 `EAutomationTestFlags` 입니다. (자세한 것은 `AutomationTest.h` 참고) |
|
|
|
|
### 단순 테스트
|
|
|
|
단순 테스트는 `IMPLEMENT_SIMPLE_AUTOMATION_TEST` 매크로를 사용하여 선언합니다:
|
|
|
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST( TClass, PrettyName, TFlags )
|
|
|
|
이 테스트는 전적으로 `RunTest()` 함수를 구현하는 것으로 그 함수성을 정의하며, `Parameters` 문자열은
|
|
항상 공백입니다.
|
|
|
|
**예:**
|
|
|
|
예를 들어, `SetRes` 명령 함수성에 대한 단순 테스트를 새로 선언한다면:
|
|
|
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST( FSetResTest, "Windows.SetResolution", ATF_Game )
|
|
|
|
위의 _SetRes_ 예제를 사용하는 구현은 다음과 같급니다:
|
|
|
|
bool FSetResTest::RunTest(const FString& Parameters)
|
|
{
|
|
FString MapName = TEXT("AutomationTest");
|
|
FEngineAutomationTestUtilities::LoadMap(MapName);
|
|
|
|
int32 ResX = GSystemSettings.ResX;
|
|
int32 ResY = GSystemSettings.ResY;
|
|
FString RestoreResolutionString = FString::Printf(TEXT("setres \%dx\%d"), ResX, ResY);
|
|
|
|
ADD_LATENT_AUTOMATION_COMMAND(FEngineWaitLatentCommand(2.0f));
|
|
ADD_LATENT_AUTOMATION_COMMAND(FExecStringLatentCommand(TEXT("setres 640x480")));
|
|
ADD_LATENT_AUTOMATION_COMMAND(FEngineWaitLatentCommand(2.0f));
|
|
ADD_LATENT_AUTOMATION_COMMAND(FExecStringLatentCommand(RestoreResolutionString));
|
|
|
|
return true;
|
|
}
|
|
|
|
### 복잡 테스트
|
|
|
|
이 테스트는 단순 테스트 선언 매크로와 비슷한 매크로를 사용합니다:
|
|
|
|
IMPLEMENT_COMPLEX_AUTOMATION_TEST( TClass, PrettyName, TFlags )
|
|
|
|
복잡 테스트에 대한 함수성을 정의하려면, `RunTest()` 함수로 각 반복처리마다의 로직을 정의하는 것에 더해
|
|
UI 에 테스트를 열거할 `GetTests()` 함수를 구현해야 합니다.
|
|
|
|
**예:**
|
|
|
|
게임에서 모든 맵을 로드하는 복잡 테스트 선언 예는 다음과 같습니다:
|
|
|
|
IMPLEMENT_COMPLEX_AUTOMATION_TEST( FLoadAllMapsInGameTest, "Maps.LoadAllInGame", ATF_Game )
|
|
|
|
맵 로드 예제를 사용하는 구현은 다음과 같습니다:
|
|
|
|
void FLoadAllMapsInGameTest::GetTests(TArray<FString>& OutBeautifiedNames, TArray <FString>& OutTestCommands) const
|
|
{
|
|
FEngineAutomationTestUtilities Utils;
|
|
TArray<FString> FileList;
|
|
FileList = GPackageFileCache->GetPackageFileList();
|
|
|
|
// 모든 파일을 대상으로 반복처리, 확장자가 map 인 파일 추가.
|
|
for( int32 FileIndex=0; FileIndex< FileList.Num(); FileIndex++ )
|
|
{
|
|
const FString& Filename = FileList[FileIndex];
|
|
|
|
// MAPSONLY 모드라면 map 확장자가 없는 파일명 무시.
|
|
if ( FPaths::GetExtension(Filename, true) == FPackageName::GetMapPackageExtension() )
|
|
{
|
|
if (!Utils.ShouldExcludeDueToPath(Filename))
|
|
{
|
|
OutBeautifiedNames.Add(FPaths::GetBaseFilename(Filename));
|
|
OutTestCommands.Add(Filename);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool FLoadAllMapsInGameTest::RunTest(const FString& Parameters)
|
|
{
|
|
FString MapName = Parameters;
|
|
|
|
FEngineAutomationTestUtilities::LoadMap(MapName);
|
|
ADD_LATENT_AUTOMATION_COMMAND(FEnqueuePerformanceCaptureCommands());
|
|
|
|
return true;
|
|
}
|
|
|
|
## 잠복성 명령
|
|
|
|
Latent Commands (잠복성 명령)으로 자동화 테스트 일부를 여러 프레임에 걸쳐 실행할 수 있습니다.
|
|
_RunTest_ 호출 도중 큐에 등록하기 위함입니다.
|
|
|
|
첫 단계는 다음과 같은 문법으로 잠복성 명령을 선언하는 것입니다:
|
|
|
|
DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FExecStringLatentCommand, FString, ExecCommand);
|
|
|
|
bool FExecStringLatentCommand::Update()
|
|
|
|
Update 호출 이후 실행이 완료되었다면 참을, 자동화 테스트를 멈추고서 다음 프레임에 다시 실행하고자
|
|
한다면 _False_ 를 반환할 것입니다. 명령은 순서대로 실행되며, _Update_ 에서 잠복성 명령이 _False_ 를
|
|
반환한다면 실행은 계속되지 않습니다.
|
|
|
|
두 번째 단계는 잠복성 명령을 실행 큐에 등록하는 것입니다. 문구의 중복을 피하기 위해서 다음과 같은
|
|
상용구로 포장되어 있습니다:
|
|
|
|
ADD_LATENT_AUTOMATION_COMMAND(FExecStringLatentCommand(TEXT("setres 640x480")));
|
|
|
|
예제는 EngineAutomationTests.cpp 의 FSetResTest 를 참고해 보세요.
|
|
|
|
## 참고
|
|
|
|
[REGION:warning]
|
|
에디터에서, 맵 로딩은 즉시 일어납니다. 게임에서, 맵 로딩은 다음 프레임에 일어나므로
|
|
[잠복성 명령](#잠복성명령) 을 사용해야 합니다.
|
|
[/REGION] |