INTSourceChangelist:3682799 Availability:Docs Title:機能テスト Crumbs: %ROOT% Description:機能テストのフレームワーク type:overview skilllevel:Intermediate Version:4.17 parent:Programming/Automation order: tags:Automation tags:Testing [TOC (start:2 end:3)] ## テストの作成 テストのセットアップは、[**Functional Test**](API:AFunctionalTest) アクタをレベルに配置すればできます。このアクタは、 [Level ブループリント](Engine/Blueprints/UserGuide/Types/LevelBlueprint/) の **レベルスクリプト** によって、一連のテストを実行するようにスクリプティングすることができます。テスト自体は、 Functional Test そのものに組み込むか (子コード クラスまたはブループリントで)、レベル スクリプトで直接アセンブルすることができます。 ![](FunctionalTest_LevelBP.png) [REGION:caption]プレースホルダー機能テストを実行している Level ブループリント[/REGION] ### Functional Test クラス機能 Functional Test クラスには、以下の重要な関数があります。 | 関数名 | 説明 | | --- | --- | | `PrepareTest` | `PrepareTest` 関数は、コードまたはブループリントの子クラスでオーバーライドすることができます。この関数は `OnTestPrepare` デリゲートと共に最初に実行して、オーバーライドして、テストに必要な最初のセットアップを行うことができます。このセットアップで複数フレームが必要な場合、例えば、ストリーミング データをレベルにロードする必要がある、パス設定データをビルドする、サーバーに接続する場合、この関数がこうしたプロセスを開始します。 | | `IsReady` | この関数は最初の`PrepareTest` 呼び出しの後、ティック毎に呼び出され、`OnTestStart` が実行されるまで呼び出されます。デフォルトでこの関数は `true` を戻します。これにより、`OnTestStarted` がただちに呼び出されます。`PrepareTest` によって開始した初期化プロセスが完了しない場合、この関数は `false` を戻し、メインのテスト コードが開始しないようにします。 | | `OnTestStart` | **Functional Testing Manager** がテストを開始すると、このデリゲートが呼び出されます。これをテスト機能にバインドし、最後に必ず `FinishTest` を呼び出すようにします。 | `OnTestFinished` | テストが終了すると、このデリゲートが呼び出されます。テストは多くの場合、レベルやレベル内のアクタに影響を及ぼし、その影響は後続のテストに影響を及ぼすため、この機会にクリーンアップすることは利用可能なテスト環境を維持するうえで極めて重要です。 | Functional Test クラスには、以下の補助的な機能があります。 | 関数名またはプロパティ名 | 説明 | | --- | --- | | `OnAdditionalTestFinishedMessageRequest` | 補足情報をテスト サマリーに記録する手段として、`OnAdditionalTestFinishedMessageRequest` を実装すると便利です。 | | `RegisterAutoDestroyActor` | この関数に渡されるアクタは、テスト終了時に自動的に破棄されます。テストの一環としてスポーンされたアクタをクリーンアップするのにお勧めの方法です。 | | `LogMessage` | この関数は、入力したテキストを **Output Log** の `LogFunctionalTest` カテゴリに記録します。テスト実行中に進捗を記録するためのものです。 | | Observation Point | アクタにこのプロパティを割り当てると、プレイヤーはテスト開始時にその位置と回転にテレポートします。 | | Enabled | この変数を `false` に設定して、テストを無効にすることができます。 | ### レベルスクリプトによるテスト レベルスクリプトで機能テストを実行するには、まず Functional Test アクタをレベルに配置します。Functional Test を選択した状態で、レベルスクリプトを開き、`OnTestStart` デリゲートと Functional Test への参照を配置します。Functional Test のピンからドラッグして、ひとつ以上の `FinishTest` ノードを作成することができます。この時点でテストをビルドして、`OnTestStart` デリゲートを `FinishTest` ノード (またはテストのブランチが含まれる場合は複数のノード) に接続させることができます。テストが何らかのクリーンアップを必要とするものの場合、`OnTestFinished` 関数も作成することができます。このセットアップが完了すると、自動化システムによってこのテストを適切に実行することができます。この方法は簡易テストでは許容できますが、一般的にほとんどセットアップを必要としないか、まったく必要としないものは、複数回実行または複数のレベルで実行する必要はありません。 [REGION:tip]レベルスクリプト内のアクタ (Functional Test アクタなど) にイベントや参照を加えると、対象のアクタが**レベル エディタ** または **ワールドアウトライナー** で選択されます。[/REGION] ### 子クラスのメソッドによるテスト 機能テストでさらに複雑なセットアップが必要な場合や、複数回実行することを意図している場合 (単一レベルまたは複数レベル)、`AFunctionalTest` をオーバーライドすることをお勧めします。ベースとなる Functional Test クラスをコードまたはブループリントで拡張すると、`PrepareTest` 関数と `IsReady` 関数を使用できるようになります。これは、一段と複雑なテストや相互依存するテスト、セットアップ時間が 1 フレームよりも長いテストを実行するうえで非常に重要です。レベルスクリプトでこうしたテストを実装するのは、これまでと同じですが、大量のテスト コードを、レベルスクリプトではなくこの新しい Functional Test クラス自体に入れられるようになり、複数レベル、または同じレベル内で複数回でのテストの使用が簡単になりました。 ## 望ましいテスト結果を作成し、使用する 一部のテスト結果は、大量、複雑、厳密すぎたり、手書きのコードによるソリューションには不適切な場合があります。このような場合、単一のテストを実行するのが役立ちますが、個人的には結果が正確であることを確認し、こうした結果を保存し、将来のテスト結果と比較できるようにします。このコンセプトは **Functional Testing Editor** プラグインの **Ground Truth Data** として実装されます。 ![](FunctionalTest_Plugin.png) [REGION:caption]Ground Truth Data を使用すると、Functional Test Editor プラグインが有効になります。[/REGION] **Ground Truth Data** のコンセプトは、`UGroundTruthData` クラスで実装され、こうした結果を保存し、比較するために使用されます。Ground Truth Data Object は、選択したオブジェクトを実行中のテストの正しい結果として格納します。次にこのオブジェクトを、ライブシミュレーションの対応するオブジェクトと比較して、ロジックがテストの合否を判断します。例えば、ゴルフ ゲームなどゲームが正確で信頼できる物理シミュレーションを必要とする場合、シミュレートするプレイヤーがホールインワンを出すようなテストを行うかもしれません。Ground Truth Data (正確さを整合するためのデータ) にはオブジェクトとしてゴルフ ボールが含まれ、ライブ シミュレーションのゴルフ ボールの位置を、保存してあるもの (ホールに入ったものを想定) と比較することが可能で、テストに不合格になることなく、ごく小さなエラーだけが許容されます。こうしたテストは以下のように設計することができます。 * テスト用のゴルフ ボールを任意の位置に初期のべロシティでスポーンします。移動には一定の長さの時間を与えます。この時点では、ゴルフ ボールは理想的な位置にあるはずです。このテストの Ground Truth Data から正確なゴルフ ボールを読み込むことができます。 * Ground Truth Data が許容可能なオブジェクトを戻さない場合 (例、戻されたオブジェクトが null か、誤ったクラスの場合)、Ground Truth Data に作成したテストのゴルフ ボールを期待される結果として保存してください。ゴルフ ボールが到達すべき場所に行かなかった場合、ブループリント エディタで `ResetGroundTruth` 変数を手動で `false` に設定することで、Ground Truth Data を常にリセットすることができます。[REGION:note]ブループリント エディタで `ResetGroundTruth` ボックスをチェック後、自動的にチェックが外されますが、データはリセットされます。[/REGION] * Ground Truth Data が必要なクラス (この例では、Actor で十分です) にキャストできるオブジェクトを戻す場合、このオブジェクトとテスト用のゴルフ ボールとの比較で、テストの合否を評価することができます。 ![](GroundTruthExample.png) [REGION:caption]このテストでは、テスト用ゴルフ ボールの一定の位置、4 秒の移動時間を認められた位置を確認します。[/REGION] [REGION:tip]この方法でのテストのセットアップでは、テストを実行し、期待されるテスト結果を同じスクリプトで設定することができます。期待される結果は、エディタで Ground Truth Data を編集することでリセットすることができます。[/REGION]