johnnyGameStudio’s blog

無能なゲームプログラマのぼやき ぎーくになりたい Twitter: https://twitter.com/JGS_Developer

【UE4】最小構成でC++クラスの自動テストを試してみた

はじめに

第3回UE4何でも勉強会 in 東京に参加したが、その中で自動テストについて触れられており、興味があったのでUE4の自動テストについて触ってみた
しかし、Blueprintでのテスト手順はいくつかヒットしたが、ほとんど説明しているブログが見当たらず、あってもあまり詳細には書かれてなかったりしていたので最小構成でのC++クラスのテストをまとめておく

実行環境

UE4.21.2
VisualStudio2017

実行手順

1. プラグインを有効にしてエディタを再起動

まず最初にプラグインを有効にする。メインメニューから
編集>Plugin
を開いて、その中の「Testing」という項目を選択
その中にあるPluginはすべて有効にして、その後再起動
(これらを有効にすると、エディタの再起動を求められる。[Restart Now] ボタンをクリック)
image.png

2. セッションフロンドエンドを開く

ウィンドウ>デベロッパーツール>セッションフロントエンド
を開く
sessionFront.png

開くと「このアプリケーション」の今開いている項目を選択(緑色のアイコンになっていればOKなはず)
その後オートメーションタブを選択
sessionFront2.png

※すでにこのままでもC++以外の既存の機能はテスト可能

3.テストしたいクラスを用意する

今回は最小構成でやっているため、適当にActorを継承したAMyActorクラスを用意した
実装したcppファイルは以下のようになっている(ヘッダーは特に何もしていないので省略)
解説はソース内にコメント

// Fill out your copyright notice in the Description page of Project Settings.

#include "MyActor.h"
#include "AutomationTest.h"//マクロをつかうため

namespace
{
    AMyActor* actor = nullptr;//テストクラスからアクセスできるように無名名前空間でインスタンスのを確保(これで正しい方法かは疑問だが楽)
}
// Sets default values
AMyActor::AMyActor()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;
    actor = this;//コンストラクタで自身のポインタを渡しておく
}

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
    Super::BeginPlay();
    
}

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

}
//テストクラスから呼び出される関数
void AMyActor::ExecuteAutomationFunc()
{
    UE_LOG(LogTemp, Log, TEXT("Autonmation TEST"));
}

/*以下テストクラスの生成
AutomationTest.h内に書かれているマクロ「IMPLEMENT_SIMPLE_AUTOMATION_TEST」を使う
マクロの中身を見る限り、コンパイル時?にこのcppファイル内に第一引数で指定した名前のクラスを自動生成
RunTest関数を自動テスト側が実行するという仕組みだと思われる
第2引数はセッションフロントエンド内でのカテゴリ分け
ほかにもマクロが色々あるがそれは最後のリンクを貼っている参考にした記事で確認してみてほしい
*/
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FMySimpleTest, "MyTest.MySimpleTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
bool FMySimpleTest::RunTest(const FString& Parameters)
{
    actor->ExecuteAutomationFunc();
    return true;
}

4. テスト実行

マクロの第2引数で渡したカテゴリの設定が反映されているはずなのでそれを有効にする
(今回の場合だと「MyTest.MySimpleTest」)
テストしたい項目を有効にしたら「テストを開始する」ボタンを押す
image.png

5. 結果

以下のように
- [x] MyTestが実行されている
- [x] AMyActorのメンバ関数内のLogが正常に吐かれている
- [x] すべてのテストが正常に成功して終了している
これらが確認できるのでテスト完了。

image.png

参考

公式:自動化システムの概要
自動テストの追加方法