[ #UE4 ]Blueprintでユニットテスト・機能テスト

UnrealEngine4(以下UE4）の[ドキュメント](https://docs.unrealengine.com/latest/JPN/Programming/Automation/index.html)にはオリジナルのテストはC++で書くように書いてあるが実はBlueprint（以下BP）でも書くことができる。やり方を簡単に紹介。

# <i class="fa fa-cube" />TL;DR

* `FunctionalTest`クラスを継承したBPクラスを作成してテストのBPノードを書く
* テスト対象のレベルに上記BPを配置、StandAloneでPlayできるようにしておく
* SessionFrontEndで複数のテストやテスト回数をグラフィカルにチェック

# <i class="fa fa-cube" />環境

4.14以降？ここでは4.15で説明。

# <i class="fa fa-cube" />やりかた

## ①`FunctionalTest`の子クラス作成

まずはテストを書くBPクラスを作成する。親クラスは`FunctionalTest`を指定。

![PickParentClass_FunctionalTest.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/4559b6b2-d2e4-e07d-a365-526a49abf2f1.png)

## ②テストのBPノードグラフを書く

とりあえずサンプルとしてランダムに0～10の数字を返し、5以上なら成功、未満なら失敗という簡単なユニットテストのようなノードを書いてみる。

![SimpleUnitTestNode.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/4a63ddf0-7d2b-2243-4ebd-86bb6b274595.png)
[code](https://blueprintue.com/blueprint/hmjyx32n/)


なお実際のユニットテストとしてならBPの関数などを呼び出す形になるだろう。

以下、重要なノードの説明。

### `Event Start Test`イベントノード

ここからテストの処理が開始する。最終的に`Finish Test`ノードで終わらないとテストが完了せずにタイムアウトになるので注意。

### `Finish Test`ノード

テスト結果を通知して終了するノード。 **テストを書くときに一番大事なノード。** 失敗時にMessageLogに出力するメッセージの設定なども設定できる。

![FinishTestNode.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/237ef683-0c15-8659-a416-bfccde7a28d7.png)

Test Result入力ピンの`Succeeded`, `Failed`あたりはよく使うことになるはず。

### `Event Prepare Test`イベントノード

テスト開始前に呼ばれるイベントノード。テスト前にやっておきたい処理を書いておく。

### `Set Time Limit`ノード

タイムアウトになるまでの時間や、タイムアウトを何とみなすかの設定をするノード。これがなくてもタイムアウトで失敗になる。

![SetTimeLimitNode.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/25726a3a-4e76-e0d7-a997-7f8e5d908013.png)

## ③BPをテスト対象のレベルに配置

![TestOnMap.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/f0618d66-218d-1012-873c-684042e2d1e5.png)

レベルに配置すると、専用の3D Widget付きで表示される。
配置しなくてもよい方法もあるかもしれないが不明。

## ④Standaloneで起動できるように設定

![PlayStandalone.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/57c1e31c-2f5c-58c9-820b-53cee73bdbd5.png)

この後SessionFrontEndを使うために必要。いったん起動しておいてもよい。

## ⑤念のためUE4再起動してプロジェクトを開きなおす

そのままではSession FrontEndからTestを実行できなかった。
プロジェクトを開く直すだけでもよいかもしれない？

## ⑦Session FrontEndを開く

![OpenSessionFrontEnd.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/b400015c-6a8a-c620-b746-62b1840acc41.png)

Window > Developer Tools > Session FrontEnd

ウィンドウが開いたら、左側の`This Application`のセッションを選択。
Automatinタブのテスト一覧に、先ほど作成したBPクラス（例では`MyFunctionalTest`）が表示されればOK。

![ActivateSessionFrontend.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/80618856-0957-534f-2e07-d7874b5ffd1c.png)

※なお表示されない場合はPlayしたり、UE4開きなおしたり、しばらく待ったりすることで表示される。セッションが張られないと一覧に出てこないようである。

### ⑧テストを実行

Session FrontEndのウィンドウからStart Testsボタンを押してテストを実行する。
実行するとウィンドウでゲームが起動しつつ、テストの結果がグラフィカルに表示されてゆく。

![Result1.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/1aa84c64-3254-2df0-bf53-38f442e40f72.png)

上記は１つだけだが、複数ある場合は複数の結果が一覧で表示される。

## 他TIPS

### テストを複数回実行する

Start Testsボタンの横の▼から実行回数を増やすことができる。

![10Times.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/a940c2b1-ae43-3a9d-e345-0270388119a4.png)

サンプルコードのように毎回結果が違う場合は複数回テストを回してみてどうなるかをみることができる。



# 参考


- [自動化システムの概要](https://docs.unrealengine.com/latest/JPN/Programming/Automation/index.html)
- [[UE4] 自動テストツールの使い方](http://historia.co.jp/archives/689)
- [Tutorial: Automated Functional Testing in Blueprints in UE 4.14](https://www.youtube.com/watch?v=f4LpDXjFgVQ)