>100 Views
December 19, 25
スライド概要
C++ breaktime 2025/Winterの発表資料です。
https://cpp-osaka.connpass.com/event/374884/
UNREAL C++の ユニットテスト zbdk
概要 ■ Unreal C++でのテスト方法をまとめました ■ 実行環境 – Windows11 – UE5.5.1 – Visual Studio2022 2
ユニットテスト(単体テスト)とは ■ プログラム – 多数の部品を組み合わせて作られるもの ■ その個々の部品(ユニット)が動作しているかを確かめる テストのこと – 関数だったり – クラスだったり 3
UEのユニットテスト ■ Engine/Source/Runtime/Core/Public/Misc/AutomationTest. h ■ FAutomationTestBaseを基底とした派生クラスとして実装 ■ クラス実装用のマクロが用意されている – 簡易テスト – 複合テスト 4
簡易テスト記述例 5
チェック関数マクロ ■ UTESTから始まるチェック用マ クロがRunTest関数内で使用可能 ■ これで値が正しいかをチェック ■ いろんな種類がある – 右のマクロはごく一部 6
テスト実行方法(1/2) 7
テスト実行方法(2/2) 8
デモ 9
複合テスト 10
HTTPリクエストのテスト例 11
非同期版HTTPリクエスト 12
Latentコマンド ■ 1フレーム内に収まらないテストを実行する場合に使用 – 定義マクロで構造体を定義 – テスト中にコマンドを追加 13
Latentコマンド ■ 毎フレームUpdateが 呼び出される ■ Updateがtrueを返すと完了 ■ エラーはUE_LOGで送出 14
ユニットテストのメリット ■ 自分が知らない関数/クラス – 使い方をチェックできる – テストコード消してしまいがちだが残しておける ■ 自分が作った関数/クラス – 使い方を他人に示せる – テストしている実装=メジャーな使い方 – 「こういう風に使ってね。この時の値は○○だよ」 15
テスト駆動開発(TDD) ■ 失敗するテストコードを1つ追加する ■ そのあとメソッドを実装していく – 中身ができて期待した通りに動作するようになるので テストは成功する ■ テストコードを1つ追加する ■ 複雑になってきたらリファクタリング – それまでに書いたテストコードが「添え木」になる 16
ここから未発表資料 LT空枠を埋めるべく用意したけど時間押してたので使わなかったやつ というより時間が足りなくて削った内容 17
Spec ■ ふるまい駆動開発に従って構築されたテストの名称 ■ ふるまい駆動開発(Behavior Driven Development) – コードではなく「ふるまい」を記述するらしい – UE、C++に限らないテスト手法 ■ 少なくともUE4.15くらいにはありそう ■ UE公式ページ曰く – 自己文書化コードである – 流れるように (fluent) 記述でき、より DRY なコードに なることが多い 18
Spec記述例 19
Spec記述例 スコープ 1つのテスト実行単位 文字列はshouldから始めるべきらしい これ本当に文章として読める? 「this」かなり邪魔じゃない?? 20
Spec版HTTPリクエスト(1/2) メンバ変数を定義 各テスト前に実行する処理 Describeは入れ子にできる 各テスト前に実行する処理 21
Spec版HTTPリクエスト(2/2) ■ 共通処理を BeforeEachにまとめ られる 1フレームで終わらないので先頭にLatent付き 完了用デリゲート引数 22
Specの利点 ■ 構造化したテストを書けて従来の欠点が解消 ■ 従来の欠点 – 新しいテストを作るたびにクラスが必要 – 似たような処理がコピペで増える ■ 特にセットアップ部分 ■ コピペすると仕様変更に伴う修正が大変 – 複合テストの引数が文字列 ■ 数値へのパースが必要だった ■ パースにバグが潜む可能性も 23