Files
UnrealEngineUWP/Engine/Documentation/Source/Programming/Automation/TechnicalGuide/AutomationTechnicalGuide.KOR.udn
Ben Marsh 49831a5631 Include documentation source in repository.
[CL 2489162 by Ben Marsh in Main branch]
2015-03-24 08:35:52 -04:00

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]