#XRKaigi 2021 | コミュニティオーガナイズセッション HoloLens ミートアップ枠での発表に使用した資料です。 「MRTK Test Utilities で始めるテスト駆動開発 (TDD) 入門」 #HoloMagicians #ARKOBE #HoloLens #MRTK #Unity
MRTK Test Utilities で始めるテスト駆動開発 (TDD) 入門株式会社神戸デジタル・ラボ堀尾風仁 / Futo Horio#HoloMagicians | HoloLens ミートアップUnity Test Framework (UTF) とXR Kaigi 2021
View Slide
堀 尾 風 仁株 式 会 社 神 戸 デ ジ タ ル ・ ラ ボコ ミ ュ ニ テ ィ 運 営・ A R K O B E・ A z u r e T e c h L a b .M i c r o s o f t M V Pf o r W i n d o w s D e v e l o p m e n t( A u g u s t , 2 0 2 0 ~ )Twitter アカウント@Futo_Horio
01. MRTK / MRTK Test Utilities 概要MRTK Test Utilities って何ができるの?
MRTK ( Mixed Reality Toolkit ) とはMR アプリケーション開発を加速させる ツール や UX ビルディングブロック を提供するOSSXR Kaigi 2021・ クロスプラットフォームの入力システム、3次元空間のインタラクションやUI を提供・ ラピッドプロトタイピングの実現 : Unity Editor シミュレーションですぐに変更を確認・ 幅広いプラットフォームをサポート ( eg OpenXR, WinMR, Oculus, Mobile )・ Unity, Unreal 各ゲームエンジン向けのプロジェクトが用意されている( ※ 今回は MRTK-Unity を使用 )・Microsoft が開発を主導しているオープンソースプロジェクト・ MIT ライセンス での提供 ( 商用利用可能 )https://github.com/microsoft/MixedRealityToolkit-Unity
MRTK Test Utilities 概要Mixed Reality Toolkit のテストユーティリティ ( Package )XR Kaigi 2021・実際の MRTK コンポーネント開発でも使われているテストユーティリティ→ MRTK 開発では Unity Test Runner を使ったテストが実施されている。・Play mode (再生モード) テストを簡単に作成するためのヘルパースクリプトのコレクションhttps://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/packages/mrtk-packages?view=mrtkunity-2021-05#test-utilities-packageMRTK Test Utilities スクリプト (一部抜粋)https://github.com/microsoft/MixedRealityToolkit-Unity/tree/main/Assets/MRTK/TestsMRTK 単体テスト 一覧
MRTK Test Utilities 概要PlayModeTestUtilities を使ったハンドシミュレーションXR Kaigi 2021https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/packages/mrtk-packages?view=mrtkunity-2021-05#test-utilities-packageコードベースで、入力ソースを操作可能
02. テスト駆動開発に関する基礎知識テストコード と テスト駆動開発 の違いについて
テストコード と テスト駆動開発 ( TDD ) の違いテストに関する誤解テストコードは健康診断、テスト駆動開発 (TDD) は 健康診断 ~ 診断結果(数値) の維持・改善ループテストコードテスト駆動開発 (Test-Driven Development : TDD)- テストのためのソースコード- 現在のソースコード品質を検証するもの ( レッド, グリーン )(テストを実行するだけではコード品質は向上しない)- プロダクションコードよりも先にテストコードを記述することを原則とした開発手法- この原則は テストファース ( test first ) とも呼ばれる① 設計を行う ( テスト作成前 )② テストコードを書く ( テスト失敗 : レッド )③ プロダクションコードを書く ( テスト成功 : グリーン )④ リファクタリングを行う ( テスト成功 : グリーン )テスト駆動開発の開発サイクル時間の経過
03. Unity Test Runner の使い方Unity 標準ユニットテスト実行環境
Unity Test RunnerUnity 標準のユニットテスト実行環境Unity バージョン 2019.2 からUnity Test Framework ( UTF ) パッケージとして提供Unity Test Framework (UTF) = NUnit の Unity インテグレーションパッケージNUnit は .NET 言語向けのユニットテスト用オープンソースライブラリで、UTF では NUnit バージョン 3.5 が使用されています。Unity Test Framework (UTF) 最新バージョンは 1.1.30Unity 各バージョンごとの動作の違い
Edit Mode Test ( 編集モード )Unity Test Runner - テストの種類Unity Test Runner で実行できるテストは 2種類 あります。- 編集モード状態で実行されるテスト- オーバーヘッドが少ない- ゲーム再生 (Play) をしている状態で実行されるテスト- 手や目などの異なる入力ソースに対して、どのようなレスポンスを返すのか確認可能- ゲーム再生 (Play) 遷移時のオーバーヘッドが大きいPlay Mode Test ( 再生モード )・実行時に毎回テスト用のシーンが生成・ロードされる。基本このテストシーンを使いまわして、テストが実施される。・テストケース (テスト毎) に適切な TearDown (後処理) を行わないと、後に実行されるテストに影響が及ぶ。・テスト失敗時、稀に Assets 配下に、テスト用のシーンが保存されたままとなる事象が発生する。Play Mode Test ( 再生モード ) 実施時の注意点
検証環境本資料内のスクリーンショット等の開発環境・開発用PC ( Windows 10 Pro / ビルド番号 : 19042.1299 )・Unity 2020.3.8f1 (LTS)・Unity Test Framework 1.1.30 (from Unity Package Manager)・Mixed Reality Toolkit for Unity v2.7.2 (from Mixed Reality Feature Tool)・Mixed Reality Toolkit Foundation 2.7.2・Mixed Reality Toolkit Standard Assets 2.7.2・Mixed Reality Toolkit Test Utilities 2.7.2・Mixed Reality OpenXR Plugin 1.0.3
Unity Test Runner の使い方 (1/4)Test Runner ウィンドウを開く(グローバルメニュー)Window > General > Test Runner を選択し、Test Runner ウィンドウを開きます。
Unity Test Runner の使い方 (2/4)テストアセンブリフォルダを新規作成(Test Runner ウィンドウ)PlayMode タブを選択して、[Create PlayMode Test Assembly Folder]ボタンを押します。※ Project ウィンドウで選択しているディレクトリ配下にフォルダが生成されます。
Unity Test Runner の使い方 (3/4)テストアセンブリの確認生成されたテストフォルダにアセンブリ定義ファイル(PlayModeTests.asmdef) が含まれていることを確認します。
Unity Test Runner の使い方 (4/4)テストアセンブリの アセンブリ定義リファレンス を編集するアセンブリ定義リファレンス (Assembly Definition References) にテストに必要なアセンブリ定義を指定します。( eg MRTK.Core, MRTK.Tests.Utilities, MRTK.InputSimulation etc..)※ テストアセンブリ から事前定義済みアセンブリ (eg Assembly-CSharp.dll) の参照は不可テスト対象のクラスは独自定義アセンブリに含める必要があります。独自定義アセンブリXRKaigi2021.dll事前定義済みアセンブリAssembly-Csharp.dll再生 ( Play ) モードで動作するプログラムプロダクションコード テストコードコードプリコンパイル済みアセンブリPlugin / Standard AssetsテストアセンブリPlayModeTests.dll✕ 参照不可参照可能XR Kaigi 2021
04. MRTK Test Utilities を使ったテスト駆動開発入門実際に MRTK Test Utilities を使って、テスト駆動開発をやってみる
XR Kaigi 2021テストコードを書く前にテストコードを書く前に知っておきたい、テストコードの4フェーズパターン・テストコードを記述する際、どんなテストを実施しているのか分かりづらいと、結局テストコードを導入する意味が薄れてしまうので、テストコードも 可読性 を意識する必要がある。4フェーズテスト : Four Phase Test
MRTK Test Utilities を使ったテスト駆動開発入門設計する (サンプル)
MRTK Test Utilities を使ったテスト駆動開発入門テストコードの準備 : Setup (事前準備)① テスト用シーンに Mixed Reality Toolkit オブジェクトを追加、初期化する[UnitySetUp] 属性各テスト開始前に実行されるコルーチン
MRTK Test Utilities を使ったテスト駆動開発入門テストコードの準備 : Setup (事前準備)[UnityTest] 属性テストを実行するためのコルーチンCube を生成Interactable をアタッチOnFocusReceiver を追加ChangeMaterialColorGreen() を登録
MRTK Test Utilities を使ったテスト駆動開発入門テストコードの準備 : Exercise (テストの実行)テストハンドを生成- テストハンドの表示- テストハンドのジェスチャーを指定- テストハンドの移動- テストハンドの非表示TestHand クラスメソッド
MRTK Test Utilities を使ったテスト駆動開発入門テストコードの準備 : Verify (テスト結果の検証)比較検証には、NUnit の Assert モデルを使用します。(期待する値) と (実際の値) の比較検証する
MRTK Test Utilities を使ったテスト駆動開発入門テストコードの準備 : TearDown (後処理)MixedRealityToolkit ゲームオブジェクトを無効化する[UnityTearDown] 属性テスト終了後、毎回呼び出されるコルーチンTestUtilities クラスメソッド
MRTK Test Utilities を使ったテスト駆動開発入門テストコードを書いたクラスの実装を行う(1)① クラスとメソッドのみを用意する ② テスト実行 ( テスト失敗 : レッド )
MRTK Test Utilities を使ったテスト駆動開発入門テストコードを書いたクラスの実装を行う(2)① メソッドを実装する ② テスト実行 ( テスト成功 : グリーン )
MRTK Test Utilities を使ったテスト駆動開発入門実際のテスト時の様子 (動画)
MRTK Test Utilities を使ったテスト駆動開発入門グリーン (テスト成功) を維持しながら、リファクタリングを行う① リファクタリングする ② テスト実行 ( テスト成功 : グリーン )
(まとめ) MRTK Test Utilities と テスト駆動開発 を試してみて実際に テスト駆動開発 (TDD) を試してみた感想良かった点・回帰テスト ( Regression Test : リグレッションテスト ) を行う場面で煩雑な作業を省略できる・ソースコード変更後、繰り返し自動テストを行えるので、修正を加えやすい・カバレッジ (テストコードの網羅率) 次第だが、ソースコードの不具合 (バグ) を特定するまでの時間が短縮される・テストコードから書き始めるので、設計時により疎結合を意識するようになる・テストコード & テスト駆動開発の知識がないと開発が進まない・最初のうちはテストが正しく動作しているのか、テストのテスト (動作検証) が必要・再利用頻度の少ないソースコードではテストコードの価値が薄い (テストコードを書く場所を見極める必要がある)・複雑な手の動きをコードベースで書くのはやや面倒な場面もある完璧なテストは不可能なので、「十分に良いテスト」を書けるようまず触ってみるのが良い難しかった点
https://docs.microsoft.com/en-us/dotnet/api/microsoft.mixedreality.toolkit.tests?view=mixed-reality-toolkit-unity-2020-dotnet-2.7.0Microsoft.MixedReality.Toolkit.Tests NamespaceWriting and running testshttps://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/contributing/unit-tests?view=mrtkunity-2021-05#play-mode-testshttps://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/release-notes/mrtk-25-release-notes?view=mrtkunity-2021-05#testutilities-packageTestUtilities package ( MRTK v2.5 Release notes )https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/packages/mrtk-packages?view=mrtkunity-2021-05#test-utilities-packageTest utilities packagehttps://docs.unity3d.com/Packages/[email protected]/manual/getting-started.htmlGetting started with Unity Test Framework参考文献本資料作成時に、参考にさせていただいた技術書籍・Webサイト一覧公式サイト書籍・JUnit 実践入門 (技術評論社)・Unity ゲーム プログラミング・バイブル 2nd (株式会社ボーンデジタル)・レガシーコードからの脱却 (O’REILLY)
Qiita にも公開予定本日、お話させていただいた内容を Qiita にも公開予定です。こちらの QR コード から Qiita ページに飛べます。
ご視聴いただき、ありがとうございました!Thank youXR Kaigi 2021