[UE4] 自動テストの追加方法

07.31

[UE4] 自動テストの追加方法 はコメントを受け付けていません。

automationtool

前回の記事で自動テストツールの使い方をご紹介しました。

今回は、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以降で大きく拡張されているようです。

今後も注目していきたいですね。

 

  • このエントリーをはてなブックマークに追加

関連記事

コメントは利用できません。

カテゴリー

ページ上部へ戻る