機能テスト

機能テストのフレームワーク

Choose your operating system:

Windows

macOS

Linux

テストの作成

テストのセットアップは、 Functional Test アクタをレベルに配置すればできます。このアクタは、 Level ブループリント レベルスクリプト によって、一連のテストを実行するようにスクリプティングすることができます。テスト自体は、 Functional Test そのものに組み込むか (子コード クラスまたはブループリントで)、レベル スクリプトで直接アセンブルすることができます。

FunctionalTest_LevelBP.png

プレースホルダー機能テストを実行している Level ブループリント

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 関数も作成することができます。このセットアップが完了すると、自動化システムによってこのテストを適切に実行することができます。この方法は簡易テストでは許容できますが、一般的にほとんどセットアップを必要としないか、まったく必要としないものは、複数回実行または複数のレベルで実行する必要はありません。

または

子クラスのメソッドによるテスト

機能テストでさらに複雑なセットアップが必要な場合や、複数回実行することを意図している場合 (単一レベルまたは複数レベル)、 AFunctionalTest をオーバーライドすることをお勧めします。ベースとなる Functional Test クラスをコードまたはブループリントで拡張すると、 PrepareTest 関数と IsReady 関数を使用できるようになります。これは、一段と複雑なテストや相互依存するテスト、セットアップ時間が 1 フレームよりも長いテストを実行するうえで非常に重要です。レベルスクリプトでこうしたテストを実装するのは、これまでと同じですが、大量のテスト コードを、レベルスクリプトではなくこの新しい Functional Test クラス自体に入れられるようになり、複数レベル、または同じレベル内で複数回でのテストの使用が簡単になりました。

望ましいテスト結果を作成し、使用する

一部のテスト結果は、大量、複雑、厳密すぎたり、手書きのコードによるソリューションには不適切な場合があります。このような場合、単一のテストを実行するのが役立ちますが、個人的には結果が正確であることを確認し、こうした結果を保存し、将来のテスト結果と比較できるようにします。このコンセプトは Functional Testing Editor プラグインの Ground Truth Data として実装されます。

FunctionalTest_Plugin.png

Ground Truth Data を使用すると、Functional Test Editor プラグインが有効になります。

Ground Truth Data のコンセプトは、 UGroundTruthData クラスで実装され、こうした結果を保存し、比較するために使用されます。Ground Truth Data Object は、選択したオブジェクトを実行中のテストの正しい結果として格納します。次にこのオブジェクトを、ライブシミュレーションの対応するオブジェクトと比較して、ロジックがテストの合否を判断します。例えば、ゴルフ ゲームなどゲームが正確で信頼できる物理シミュレーションを必要とする場合、シミュレートするプレイヤーがホールインワンを出すようなテストを行うかもしれません。Ground Truth Data (正確さを整合するためのデータ) にはオブジェクトとしてゴルフ ボールが含まれ、ライブ シミュレーションのゴルフ ボールの位置を、保存してあるもの (ホールに入ったものを想定) と比較することが可能で、テストに不合格になることなく、ごく小さなエラーだけが許容されます。こうしたテストは以下のように設計することができます。

  • テスト用のゴルフ ボールを任意の位置に初期のべロシティでスポーンします。移動には一定の長さの時間を与えます。この時点では、ゴルフ ボールは理想的な位置にあるはずです。このテストの Ground Truth Data から正確なゴルフ ボールを読み込むことができます。

  • Ground Truth Data が許容可能なオブジェクトを戻さない場合 (例、戻されたオブジェクトが null か、誤ったクラスの場合)、Ground Truth Data に作成したテストのゴルフ ボールを期待される結果として保存してください。ゴルフ ボールが到達すべき場所に行かなかった場合、ブループリント エディタで ResetGroundTruth 変数を手動で false ResetGroundTruth

  • Ground Truth Data が必要なクラス (この例では、Actor で十分です) にキャストできるオブジェクトを戻す場合、このオブジェクトとテスト用のゴルフ ボールとの比較で、テストの合否を評価することができます。 GroundTruthExample.png

    このテストでは、テスト用ゴルフ ボールの一定の位置、4 秒の移動時間を認められた位置を確認します。

    この方法でのテストのセットアップでは、テストを実行し、期待されるテスト結果を同じスクリプトで設定することができます。期待される結果は、エディタで Ground Truth Data を編集することでリセットすることができます。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
閉じる