BLOGブログ

2014.07.31UE4/Debug

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

改訂バージョン: Unreal Engine 4.21

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

今回は、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では使用しません。

 

例)

また、FAutomationTestBaseクラスには TestEqual, TestSame, TestNull, … といった関数が用意されており、これらを使用することでもエラーチェックが可能です。

 

 3.ComplexTest

ComplexTestは、同じテストを複数の対象に対して実行する場合に使用します。

例えば、全てのブループリントをコンパイルする、全てのレベルを読み込む、などです。

 

定義はSimpleTest同様、ComplexTest定義用のマクロを利用します。

ComplexTestでは2つの関数を定義する必要があります。

GetTests関数で対象を列挙し、対象毎にRunTest関数が呼び出されます。

GetTests関数の第一引数がツール表示名、第二引数がRunTest関数に渡される文字列になります。

 

例)

上記の2つのテストを追加した状態でAutomationツールを起動し、テストを実行してみると、下記のような結果になります。

 

 

4.LatentCommandの使用

ここまでの方法でテストの追加は行えましたが、複数フレームに跨って実行されるようなテストには対応出来ません。

そのような場合は、RunTestからLatentCommandを登録します。

 

LatentCommandを登録しておくと、RunTestの実行後に順次実行されていきます。

登録されたLatentCommandが全て実行し終わった時点で、テストの実行が終了となります。

 

例えば、FEngineWaitlatentCommandは指定秒数待つLatentCommandで、FExecStringLatentCommandはコンソールコマンドを実行するLatentCommandです。

LatentCommandの登録には、ADD_LATENT_AUTOMATION_COMMANDマクロを使用します。

下記の例では、テスト開始から3秒後にスクリーンショットを保存します。

 

例)

5.LatentCommandの追加

もちろん、LatentCommandも独自に実装することが可能です。

 

テストと同様にマクロを使用してクラスを定義し、Update関数を記述します。

Update関数は、コマンドの実行を終了する場合はtrueを、次フレームも引き続き実行する場合はfalseを返します。テストの成否ではないので注意して下さい。

 

LatentCommand実行中にエラーや警告を出すには、UE_LOGを使用します。

エラーが発生しても、テストの実行は中断されません。エラーを出したとしても、プログラムをクラッシュさせないように注意が必要です。

 

例)

 

パラメータを持つLatentCommandを実装したい場合は、DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER マクロを使用します。

ここで指定したパラメータは、クラスのメンバ変数として実装され、コンストラクタ引数で初期化され、Update関数内から利用できます。