前回の記事で自動テストツールの使い方をご紹介しました。
今回は、C++で独自のテストを追加する方法をご紹介したいと思います。
1.テストを構成するクラスについて
テストの実装のために重要なクラスは2つあります。
これらのクラスを継承して独自のテストを作成しますが、通常は直接クラスを記述することはせずに、予め用意された下記のようなマクロを利用します。
- IMPLEMENT_SIMPLE_AUTOMATION_TEST( TClass, PrettyName, TFlags )
- IMPLEMENT_COMPLEX_AUTOMATION_TEST( TClass, PrettyName, TFlags )
- DEFINE_LATENT_AUTOMATION_COMMAND(CommandName)
- DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(CommandName,ParamType,ParamName)
これらのマクロは、AutomationTest.h に定義されています。
2.SimpleTest
もっとも基本的なテストは、SimpleTestと呼ばれます。
IMPLEMENT_SIMPLE_AUTOMATION_TEST マクロを使用してクラスを定義し、関数を1つ実装すれば完了です。
マクロの引数は、順に、クラス名,ツール表示名(.でカテゴリをネスト), フラグ となっています。
RunTest関数の戻り値がテスト結果となります。引数のParametersはSimpleTestでは使用しません。
例)
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FMySimpleTest, "MyTest.MySimpleTest", EAutomationTestFlags::ATF_Editor)
bool FMySimpleTest::RunTest(const FString& Parameters)
{
return true;
}
また、FAutomationTestBaseクラスには TestEqual, TestSame, TestNull, … といった関数が用意されており、これらを使用することでもエラーチェックが可能です。
3.ComplexTest
ComplexTestは、同じテストを複数の対象に対して実行する場合に使用します。
例えば、全てのブループリントをコンパイルする、全てのレベルを読み込む、などです。
定義はSimpleTest同様、ComplexTest定義用のマクロを利用します。
ComplexTestでは2つの関数を定義する必要があります。
GetTests関数で対象を列挙し、対象毎にRunTest関数が呼び出されます。
GetTests関数の第一引数がツール表示名、第二引数がRunTest関数に渡される文字列になります。
例)
IMPLEMENT_COMPLEX_AUTOMATION_TEST( FMyComplexTest, "MyTest.MyComplexTest", EAutomationTestFlags::ATF_Editor )
void FMyComplexTest::GetTests(TArray<FString>& OutBeautifiedNames, TArray<FString>& OutTestCommands) const
{
OutBeautifiedNames.Add("MyTestItem01"); OutTestCommands.Add("11111");
OutBeautifiedNames.Add("MyTestItem02"); OutTestCommands.Add("22222");
}
bool FMyComplexTest::RunTest(const FString& Parameters)
{
return (Parameters == "11111");
}
上記の2つのテストを追加した状態でAutomationツールを起動し、テストを実行してみると、下記のような結果になります。

4.LatentCommandの使用
ここまでの方法でテストの追加は行えましたが、複数フレームに跨って実行されるようなテストには対応出来ません。
そのような場合は、RunTestからLatentCommandを登録します。
LatentCommandを登録しておくと、RunTestの実行後に順次実行されていきます。
登録されたLatentCommandが全て実行し終わった時点で、テストの実行が終了となります。
例えば、FEngineWaitlatentCommandは指定秒数待つLatentCommandで、FExecStringLatentCommandはコンソールコマンドを実行するLatentCommandです。
LatentCommandの登録には、ADD_LATENT_AUTOMATION_COMMANDマクロを使用します。
下記の例では、テスト開始から3秒後にスクリーンショットを保存します。
例)
void FMySimpleTest::RunTest(const FString& Parameters)
{
ADD_LATENT_AUTOMATION_COMMAND(FEngineWaitLatentCommand(3.0));
ADD_LATENT_AUTOMATION_COMMAND(FExecStringLatentCommand(TEXT("HighResShot 1280x720")));
return true;
}
5.LatentCommandの追加
もちろん、LatentCommandも独自に実装することが可能です。
テストと同様にマクロを使用してクラスを定義し、Update関数を記述します。
Update関数は、コマンドの実行を終了する場合はtrueを、次フレームも引き続き実行する場合はfalseを返します。テストの成否ではないので注意して下さい。
LatentCommand実行中にエラーや警告を出すには、UE_LOGを使用します。
エラーが発生しても、テストの実行は中断されません。エラーを出したとしても、プログラムをクラッシュさせないように注意が必要です。
例)
DEFINE_LATENT_AUTOMATION_COMMAND(FMyLatentCommand)
bool FMyLatentCommand::Update()
{
if(MyErrorCheck())
{
UE_LOG(LogTemp, Error, TEXT("MyError"));
}
if(MyWarningCheck())
{
UE_LOG(LogTemp, Warning, TEXT("MyWarning"));
}
return true;
}
パラメータを持つLatentCommandを実装したい場合は、DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER マクロを使用します。
ここで指定したパラメータは、クラスのメンバ変数として実装され、コンストラクタ引数で初期化され、Update関数内から利用できます。
今回の内容はUE4.2時点での内容になりますが、自動テスト機能は4.3以降で大きく拡張されているようです。
今後も注目していきたいですね。