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.9 KiB
Plaintext
169 lines
7.9 KiB
Plaintext
INTSourceChangelist:2374181
|
|
Availability:Public
|
|
Title:自動化に関するテクニカルガイド
|
|
Crumbs: %ROOT%, Programming, Programming/Automation
|
|
Description:新規の自動化テストを作成するためのプログラマー用ガイド
|
|
バージョン4.5
|
|
|
|
自動化テストには、主に**[Simple]** と **[Complex]** の二通りの方法があります。Simple テストは、
|
|
単一の最小限のテストを表し、Complex テストは同じコードを複数の入力に対し実行します。
|
|
|
|
Simple テストは、ある特定の機能が予定通りに動作していることを確認する際に実用的です。これらのテストは、
|
|
一般に単体テストまたは機能テストです。例えば、Simple テストは、現在のマップが _Play In Editor_ にロードされるかをテスト、
|
|
もしくは、テキストラッピングがスレートで正しく機能しているかをテストする際に使用します。
|
|
|
|
Complex テストはアイテム群を介した反復や、各アイテムで
|
|
同機能を実行する際に有益です。これは通常はコンテンツ負荷テストです。例えば全てのマップの読み込み、または全ブループリントのコンパイルなどが、
|
|
Complex の自動化テストに適しています。
|
|
|
|
## アーキテクチャと実行
|
|
|
|
全ての Automation テストは、コマンドセットの実行に汎用機能を定義する`FAutomationTestBase`
|
|
クラスから派生しています。新規の Automation テストの設定時に使用する `FAutomationTestBase` クラスの
|
|
重要な関数が以下となります。
|
|
|
|
| メンバ関数 | 説明 |
|
|
| ---------------- | ----------- |
|
|
| `GetTests()` | `RunTest()`に渡されるパラメータを、一つずつコマンドリストへ入れます。 |
|
|
| `RunTest()` | 渡されるコマンド文字列を使用してテスト ロジックを実行します。|
|
|
|
|
以下は、Automation テストの一般的な実行フローとなります。
|
|
|
|
/-----------------\ /--------------\ /---------------\
|
|
| Automation UI | | GetTests() | | RunTest() |
|
|
+-----------------+ +--------------+ +---------------+
|
|
| | | | | |
|
|
| o Start +-------+ o Commands +---+-->+ o Parameters +--\
|
|
| | | | | | | |
|
|
\-----------------/ \--------------/ | \---------------/ |
|
|
| |
|
|
\----------------------/
|
|
|
|
## ディレクトリ
|
|
|
|
現在の決まりでは、全ての自動化テストは、関連性のあるモジュール内の
|
|
`Private\Tests` ディレクトリへ入ります。テストが特定クラスと一対一でマッチした時、テストファイル名を `[ClassFilename]Test.cpp` としてください。
|
|
|
|
## テストの作成
|
|
|
|
各自動化テストは、特別なマクロを使って宣言されます。Simple テストまたは Complex テストによってマクロは異なりますが、
|
|
各マクロが必要とするパラメータは同一です。
|
|
|
|
| パラメータ | 説明 |
|
|
| --------- | ----------- |
|
|
| `TClass` | テストのクラス名です |
|
|
| `PrettyName` | UI に表示される階層的なテストの名前を指定した文字列です |
|
|
| `TFlags` | 自動化テストの必要条件や動作を指定した`EAutomationTestFlags`です(詳細は `AutomationTest.h` を参照) |
|
|
|
|
### Simpleテスト
|
|
|
|
Simpleテストは `IMPLEMENT_SIMPLE_AUTOMATION_TEST`マクロを使用して以下のように宣言します。
|
|
|
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST( TClass, PrettyName, TFlags )
|
|
|
|
このテストは、単に `RunTest() を実装することによってその機能性を定義し、
|
|
`Parameters` 文字列は常に空の文字列となります。
|
|
|
|
**例**
|
|
|
|
以下は `SetRes` コマンド機能の新しい Simple テストの宣言例です。
|
|
|
|
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;
|
|
}
|
|
|
|
### Complexテスト
|
|
|
|
Complex テストは、以下のように Simple テストの宣言マクロと類似したマクロを使用します。
|
|
|
|
IMPLEMENT_COMPLEX_AUTOMATION_TEST( TClass, PrettyName, TFlags )
|
|
|
|
Complex テストの機能を定義するには、UI にテストを列挙する `GetTests()` 関数と、
|
|
各イタレーションで実行するロジックを定義する `RunTest()` 関数を実装しなくてはいけません。
|
|
|
|
**例**
|
|
|
|
ゲームの全マップを読み込むための Complex テストの宣言例が以下となります。
|
|
|
|
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();
|
|
|
|
// マップ拡張子のついたファイルを追加して、全てのファイルを反復します。
|
|
for( int32 FileIndex=0; FileIndex< FileList.Num(); FileIndex++ )
|
|
{
|
|
const FString& Filename = FileList[FileIndex];
|
|
|
|
// [MAPSONLY] モードの場合、マップ拡張子がないファイル名は無視します。
|
|
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コマンド
|
|
|
|
Latent コマンドは、複数のフレーム上で自動化テストのセクションを実行します。これらは、
|
|
_RunTest_ コール時に待ち行列に入ることを意図しています。
|
|
|
|
最初に、以下のシンタックスを使用して Latent コマンドを宣言します。
|
|
|
|
DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FExecStringLatentCommand, FString, ExecCommand);
|
|
|
|
bool FExecStringLatentCommand::Update()
|
|
|
|
Update コールは、実行終了時に _true_ を、自動化テストの実行を中止して
|
|
次のフレームで再度試みる時に _false_ を返します。コマンドは順番に実行され、Latent コマンドが _Update_ から _false_ を返すと
|
|
実行は継続しません。
|
|
|
|
次に、実行のため Latent コマンドを待ち行列へ追加します。コマンドはボイラープレートコードを回避するため、
|
|
以下の様にマクロでラップします。
|
|
|
|
ADD_LATENT_AUTOMATION_COMMAND(FExecStringLatentCommand(TEXT("setres 640x480")));
|
|
|
|
`EngineAutomationTests.cpp` にある `FSetResTest` が例として挙げられます。
|
|
|
|
##注記
|
|
|
|
[REGION:warning]
|
|
エディタは、マップの読み込みをすぐに開始します。ゲームは、マップの読み込みを次のフレームで開始するため、
|
|
[Latentコマンド](#Latentコマンド) を使用しなくてはいけません。
|
|
[/REGION] |