関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2014.07.31UE4UE/ Debug
改訂バージョン: Unreal Engine 4.21 |
前回の記事で自動テストツールの使い方をご紹介しました。
今回は、C++で独自のテストを追加する方法をご紹介したいと思います。
テストの実装のために重要なクラスは2つあります。
これらのクラスを継承して独自のテストを作成しますが、通常は直接クラスを記述することはせずに、予め用意された下記のようなマクロを利用します。
これらのマクロは、AutomationTest.h に定義されています。
もっとも基本的なテストは、SimpleTestと呼ばれます。
IMPLEMENT_SIMPLE_AUTOMATION_TEST マクロを使用してクラスを定義し、関数を1つ実装すれば完了です。
マクロの引数は、順に、クラス名,ツール表示名(.でカテゴリをネスト), フラグ となっています。
RunTest関数の戻り値がテスト結果となります。引数のParametersはSimpleTestでは使用しません。
例)
1 2 3 4 5 |
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FMySimpleTest, "MyTest.MySimpleTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) bool FMySimpleTest::RunTest(const FString& Parameters) { return true; } |
また、FAutomationTestBaseクラスには TestEqual, TestSame, TestNull, … といった関数が用意されており、これらを使用することでもエラーチェックが可能です。
ComplexTestは、同じテストを複数の対象に対して実行する場合に使用します。
例えば、全てのブループリントをコンパイルする、全てのレベルを読み込む、などです。
定義はSimpleTest同様、ComplexTest定義用のマクロを利用します。
ComplexTestでは2つの関数を定義する必要があります。
GetTests関数で対象を列挙し、対象毎にRunTest関数が呼び出されます。
GetTests関数の第一引数がツール表示名、第二引数がRunTest関数に渡される文字列になります。
例)
1 |
IMPLEMENT_COMPLEX_AUTOMATION_TEST(FMyComplexTest, "MyTest.MyComplexTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) |
void FMyComplexTest::GetTests(TArray& OutBeautifiedNames, TArray& 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ツールを起動し、テストを実行してみると、下記のような結果になります。
ここまでの方法でテストの追加は行えましたが、複数フレームに跨って実行されるようなテストには対応出来ません。
そのような場合は、RunTestからLatentCommandを登録します。
LatentCommandを登録しておくと、RunTestの実行後に順次実行されていきます。
登録されたLatentCommandが全て実行し終わった時点で、テストの実行が終了となります。
例えば、FEngineWaitlatentCommandは指定秒数待つLatentCommandで、FExecStringLatentCommandはコンソールコマンドを実行するLatentCommandです。
LatentCommandの登録には、ADD_LATENT_AUTOMATION_COMMANDマクロを使用します。
下記の例では、テスト開始から3秒後にスクリーンショットを保存します。
例)
1 2 3 4 5 6 7 |
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetResTest, "Windows.SetResolution", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) bool FSetResTest::RunTest(const FString& Parameters) { ADD_LATENT_AUTOMATION_COMMAND(FEngineWaitLatentCommand(3.0f)); ADD_LATENT_AUTOMATION_COMMAND(FExecStringLatentCommand(TEXT("HighResShot 1280x720"))); return true; } |
もちろん、LatentCommandも独自に実装することが可能です。
テストと同様にマクロを使用してクラスを定義し、Update関数を記述します。
Update関数は、コマンドの実行を終了する場合はtrueを、次フレームも引き続き実行する場合はfalseを返します。テストの成否ではないので注意して下さい。
LatentCommand実行中にエラーや警告を出すには、UE_LOGを使用します。
エラーが発生しても、テストの実行は中断されません。エラーを出したとしても、プログラムをクラッシュさせないように注意が必要です。
例)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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関数内から利用できます。