[UE4] カスタムGauntletControllerを使用した自動テスト

検証バージョン：UE4.26
#1. 概要
この記事では Gauntlet Automation Frameworkを使用した自動化テストにおける、プロジェクトで独自のコントローラを使用する方法を記載しています。

・公式ドキュメント
[Gauntlet Automation Framework](https://docs.unrealengine.com/4.26/ja/TestingAndOptimization/Automation/Gauntlet/)
・関連記事
[[UE4] Gauntlet Automation Framework](https://qiita.com/donbutsu17/items/cd17d500a9fed143e061)

#2. 手順
 ElementalDemo のサンプルを利用した手順を記載しています。

###1) プロジェクトでGauntlet Pluginを有効化
Editorでプロジェクトを起動してPluginsからプラグインを有効にします。

###2) プロジェクトにカスタムGauntletTestControllerを追加
プロジェクトで使用するためのカスタムコントローラクラスを追加します。
今回は例として以下のように作成してTickでログを出力するようにしています。

```cpp:MyGauntletTestController.cpp
#include "MyGauntletTestController.h"

DEFINE_LOG_CATEGORY_STATIC(LogMyGauntlet, Log, All);

namespace
{
	const double DelayTime = 20.0;
}

void UMyGauntletTestController::OnInit()
{
	UE_LOG(LogMyGauntlet, Display, TEXT("Start Gauntlet Test."));
}

void UMyGauntletTestController::OnTick(float TimeDelta)
{
	GetGauntlet()->MarkHeartbeatActive("MyGauntlet OnTick");

	UE_LOG(LogMyGauntlet, Log, TEXT("MyGauntlet OnTick"));
}
```

```cpp:MyGauntletTestController.h
#pragma once

#include "CoreMinimal.h"
#include "GauntletTestController.h"
#include "GauntletTestControllerBootTest.h"
#include "MyGauntletTestController.generated.h"

UCLASS()
class ELEMENTALDEMO_API UMyGauntletTestController : public UGauntletTestControllerBootTest
{
	GENERATED_BODY()
public:
	virtual void OnInit() override;
	virtual void OnTick(float TimeDelta) override;
};
```

###3) プロジェクトのパッケージを作成する
パッケージを作成すると[Project]/Saved/StagedBuildsにテスト用のアセット一式が配置されます。

###4) UATからガントレットテストを開始する
バッチファイルからガントレットテストを開始してプロジェクトを起動します。今回は以下の例でバッチを作成して起動しています。ポイントは**OPTION=-ExecCmds="-gauntlet=MyGauntletTestController"**の部分で、起動時に使用するコントローラを指定していることです。カスタムコントローラはこのように起動オプションから指定する必要があります。

```batchfile:
set UAT_PATH=D:\Release-4.26\Engine\Build\BatchFiles\RunUAT.bat
set PRJ_NAME=C:\Projects\ElementalDemo\ElementalDemo.uproject
set STAGING_DIR=C:\Projects\ElementalDemo\Saved\StagedBuilds
set TEST_CMD=RunUnreal
set TEST_NAME=ElementalDemoTest
set PLATFORM=Win64
set CONFIG=Development
set OPTION=-ExecCmds="-gauntlet=MyGauntletTestController"

rem ********************* Start Gauntlet Test *********************
%UAT_PATH% %TEST_CMD% -project=%PRJ_NAME% -platform=%PLATFORM% -configuration=%CONFIG% -test=%TEST_NAME% -build=%STAGING_DIR% %OPTION%
rem ********************* End   Gauntlet Test *********************
pause
```
これでカスタムコントローラを使用したテストができるようになりました。

#3. 確認方法
UATからガントレットテストを開始して正しくコントローラを追加できていたら、以下のようなログが出力されます。これが出力されない場合は、引数が正しく追加できているか、プロジェクトをパッケージして最新のコントローラがワーキングディレクトリ（StagedBuilds）に反映されているかをご確認ください。

![2021-07-01_17h21_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/4ba9aa98-089f-4e91-ac59-1dfb6bdde9f1.png)

GauntletControllerはゲームのアプリケーションに組み込まれるため、**UE_LOG**を使用したログ出力はゲーム側での出力となり、UATを実行しているコンソールには表示されません。例えば今回のケースでは以下のログをコントローラに追加していますが、これはゲーム側の出力となります。これをリアルタイムに確認したい場合は、**Showlog**コマンドでゲーム側のコンソールを出力して表示されることを確認してください。

```
	UE_LOG(LogMyGauntlet, Log, TEXT("MyGauntlet OnTick"));
```
![2021-07-01_17h20_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/550147aa-092d-3fa2-7459-0ec18b576fa0.png)

ゲーム側からコントローラを経由してUAT側のコンソールに出力したい場合は、MarkHeartbeatActive()を利用して出力することができます。

```
	GetGauntlet()->MarkHeartbeatActive("MyGauntlet OnTick");
```

![2021-07-01_17h48_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/b6c7ac84-c262-d597-0e9f-e9e570c1d9bc.png)