>100 Views
March 22, 25
スライド概要
とっとるびー第54回の発表資料です
エンジニアです
UnrealEngineでアクタの単体テストをやってみた @mechamogera
自己紹介 • mechamogera • 主にQiitaで活動:https://qiita.com/mechamogera • 包丁で指を切って4針縫った • 謎のあせも発症 • 昨日花粉症発症 2
UnrealEngineとアクタ • UnrealEngine o EpicGamesが提供する3Dプログラミングのプラットフォーム • アクタ o マップに配置するオブジェクトの基本単位、ベースクラス o キャラクターやライト、カメラなどの様々のアクタが存在 3
自動テストの背景 • テスト対象:VRマルチプレイのコミュニケーションアプリ o VR:グラフィカルな要素多い o 入力:コントローラーと手の動き o マルチプレイ:複数接続が必要 • UnrealEngine o テストフレームワーク:マルチプレイ/モック/スタブ非サポートでテ ストの自動化が困難 • => ただ、ロジック部分は自動テストしたい 感覚的に一番バグるのがネットワークロジック回り 変数の設定で限定的にマルチプレイも確認可能 4
UnrealEngineのFunctional Test • UnrealEngineのテストフレームワーク o Unreal Engine の機能テスト | Unreal Engine 5.5 ドキュメンテーション | Epic Developer Community • FunctionalTestクラスまたはその子クラス(C++ or Blueprint)をLevel に配置することでテストが可能 5
アクタの単体テストの実装フロー • 対象のアクタクラスを継承してテスト用の子クラスを作成 • メソッド、カスタムイベントをオーバーライドしてコストの重 い処理を無効化 o サーバーにファイルをアップロードする o ファイルを読み込む • 依存するアクタを継承するかインターフェースを実装してイン スタンスを置き換える口を用意して置き換え • FunctionalTestを継承してテスト用の子クラスのテストを実装 • 作成したクラスのインスタンスをLevelに配置 6
テストの実行方法 • UnrealEngine Editorから実行可能 7
CICDでのテストの実行 • コマンドラインからテスト実行可能 UE4Editor.exe -NullRHI -nosplash [Project].uproject ExecCmds=”Automation RunTests [テスト];Quit” o -NullRHI:ウィンドウを表示しない o -nosplash:起動時のスプラッシュ画面を表示しない o -ExecCmds:起動時にコンソールコマンドを実行 ▪ 指定したテストを実行して終了 ▪ 本当はテスト→パッケージビルドにしたいがgit cleanしているの でクリアされてしまうのでパッケージビルド→テストで実施 ビルド→テスト→パッケージビルドだと遅い? 8
パッケージにテストアセットを含めないようにする • テスト用のアセットを含めるとパッケージのサイズが大きくな る • パッケージングに含めない2つの方法 o プラグイン形式:テスト関連コンテンツをプラグイン形式にしてパッ ケージングの際はプラグインを外す o Cookしない:Packagingの設定でDirectories to never cookでテストのルー トフォルダを指定する 9
テストをマップに追加するスクリプト • テストを用意するたびにマップに配置する必要あり • 手動が面倒なのでメニューから一発でできるようにしてみた • UnrealEngineで選択したアセットを右クリックメニュー1発で マップに配置する #UnrealEngine5 - Qiita o テスト用のマップを開いて選択したアセットのインスタンスがなけれ ば作成して保存 10
テストをやってみて • テスト実装の手間はあるがエラーケースのテストがしやすい • エラーログは出ているがシレっと通っているケースが分かる • 単体テストでは限界がある • RPCの実行確認などはできないのでネットワークのテストほし い • 手元環境で成功するがCICD環境で失敗するケースがあった 11