Slide 1

Slide 1 text

MRTK Test Utilities で始めるテスト駆動開発 (TDD) 入門 株式会社神戸デジタル・ラボ 堀尾風仁 / Futo Horio #HoloMagicians | HoloLens ミートアップ Unity Test Framework (UTF) と XR Kaigi 2021

Slide 2

Slide 2 text

堀 尾 風 仁 株 式 会 社 神 戸 デ ジ タ ル ・ ラ ボ コ ミ ュ ニ テ ィ 運 営 ・ 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 P f 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

Slide 3

Slide 3 text

01. MRTK / MRTK Test Utilities 概要 MRTK Test Utilities って何ができるの?

Slide 4

Slide 4 text

MRTK ( Mixed Reality Toolkit ) とは MR アプリケーション開発を加速させる ツール や UX ビルディングブロック を提供するOSS XR Kaigi 2021 ・ クロスプラットフォームの入力システム、3次元空間のインタラクションやUI を提供 ・ ラピッドプロトタイピングの実現 : Unity Editor シミュレーションですぐに変更を確認 ・ 幅広いプラットフォームをサポート ( eg OpenXR, WinMR, Oculus, Mobile ) ・ Unity, Unreal 各ゲームエンジン向けのプロジェクトが用意されている ( ※ 今回は MRTK-Unity を使用 ) ・Microsoft が開発を主導しているオープンソースプロジェクト ・ MIT ライセンス での提供 ( 商用利用可能 ) https://github.com/microsoft/MixedRealityToolkit-Unity

Slide 5

Slide 5 text

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-package MRTK Test Utilities スクリプト (一部抜粋) https://github.com/microsoft/MixedRealityToolkit-Unity/tree/main/Assets/MRTK/Tests MRTK 単体テスト 一覧

Slide 6

Slide 6 text

MRTK Test Utilities 概要 PlayModeTestUtilities を使ったハンドシミュレーション XR Kaigi 2021 https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/packages/mrtk-packages?view=mrtkunity-2021-05#test-utilities-package コードベースで、入力ソースを操作可能

Slide 7

Slide 7 text

02. テスト駆動開発に関する基礎知識 テストコード と テスト駆動開発 の違いについて

Slide 8

Slide 8 text

テストコード と テスト駆動開発 ( TDD ) の違い テストに関する誤解 テストコードは健康診断、テスト駆動開発 (TDD) は 健康診断 ~ 診断結果(数値) の維持・改善ループ テストコード テスト駆動開発 (Test-Driven Development : TDD) - テストのためのソースコード - 現在のソースコード品質を検証するもの ( レッド, グリーン ) (テストを実行するだけではコード品質は向上しない) - プロダクションコードよりも先にテストコードを記述することを原則とした開発手法 - この原則は テストファース ( test first ) とも呼ばれる ① 設計を行う ( テスト作成前 ) ② テストコードを書く ( テスト失敗 : レッド ) ③ プロダクションコードを書く ( テスト成功 : グリーン ) ④ リファクタリングを行う ( テスト成功 : グリーン ) テスト駆動開発の開発サイクル 時間の経過

Slide 9

Slide 9 text

03. Unity Test Runner の使い方 Unity 標準ユニットテスト実行環境

Slide 10

Slide 10 text

Unity Test Runner Unity 標準のユニットテスト実行環境 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.30 Unity 各バージョンごとの動作の違い

Slide 11

Slide 11 text

Edit Mode Test ( 編集モード ) Unity Test Runner - テストの種類 Unity Test Runner で実行できるテストは 2種類 あります。 - 編集モード状態で実行されるテスト - オーバーヘッドが少ない - ゲーム再生 (Play) をしている状態で実行されるテスト - 手や目などの異なる入力ソースに対して、 どのようなレスポンスを返すのか確認可能 - ゲーム再生 (Play) 遷移時のオーバーヘッドが大きい Play Mode Test ( 再生モード ) ・実行時に毎回テスト用のシーンが生成・ロードされる。基本このテストシーンを使いまわして、テストが実施される。 ・テストケース (テスト毎) に適切な TearDown (後処理) を行わないと、後に実行されるテストに影響が及ぶ。 ・テスト失敗時、稀に Assets 配下に、テスト用のシーンが保存されたままとなる事象が発生する。 Play Mode Test ( 再生モード ) 実施時の注意点

Slide 12

Slide 12 text

検証環境 本資料内のスクリーンショット等の開発環境 ・開発用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

Slide 13

Slide 13 text

Unity Test Runner の使い方 (1/4) Test Runner ウィンドウを開く (グローバルメニュー) Window > General > Test Runner を選択し、 Test Runner ウィンドウを開きます。

Slide 14

Slide 14 text

Unity Test Runner の使い方 (2/4) テストアセンブリフォルダを新規作成 (Test Runner ウィンドウ) PlayMode タブを選択して、 [Create PlayMode Test Assembly Folder] ボタンを押します。 ※ Project ウィンドウで選択しているディレクトリ配下にフォルダが生成されます。

Slide 15

Slide 15 text

Unity Test Runner の使い方 (3/4) テストアセンブリの確認 生成されたテストフォルダに アセンブリ定義ファイル (PlayModeTests.asmdef) が 含まれていることを確認します。

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

04. MRTK Test Utilities を使ったテスト駆動開発入門 実際に MRTK Test Utilities を使って、テスト駆動開発をやってみる

Slide 18

Slide 18 text

XR Kaigi 2021 テストコードを書く前に テストコードを書く前に知っておきたい、テストコードの4フェーズパターン ・テストコードを記述する際、どんなテストを実施しているのか分かりづらいと、 結局テストコードを導入する意味が薄れてしまうので、テストコードも 可読性 を意識する必要がある。 4フェーズテスト : Four Phase Test

Slide 19

Slide 19 text

MRTK Test Utilities を使ったテスト駆動開発入門 設計する (サンプル)

Slide 20

Slide 20 text

MRTK Test Utilities を使ったテスト駆動開発入門 テストコードの準備 : Setup (事前準備) ① テスト用シーンに Mixed Reality Toolkit オブジェクトを追加、初期化する [UnitySetUp] 属性 各テスト開始前に実行されるコルーチン

Slide 21

Slide 21 text

MRTK Test Utilities を使ったテスト駆動開発入門 テストコードの準備 : Setup (事前準備) [UnityTest] 属性 テストを実行するためのコルーチン Cube を生成 Interactable をアタッチ OnFocusReceiver を追加 ChangeMaterialColorGreen() を登録

Slide 22

Slide 22 text

MRTK Test Utilities を使ったテスト駆動開発入門 テストコードの準備 : Exercise (テストの実行) テストハンドを生成 - テストハンドの表示 - テストハンドのジェスチャーを指定 - テストハンドの移動 - テストハンドの非表示 TestHand クラスメソッド

Slide 23

Slide 23 text

MRTK Test Utilities を使ったテスト駆動開発入門 テストコードの準備 : Verify (テスト結果の検証) 比較検証には、NUnit の Assert モデルを使用します。 (期待する値) と (実際の値) の比較検証する

Slide 24

Slide 24 text

MRTK Test Utilities を使ったテスト駆動開発入門 テストコードの準備 : TearDown (後処理) MixedRealityToolkit ゲームオブジェクトを無効化する [UnityTearDown] 属性 テスト終了後、毎回呼び出されるコルーチン TestUtilities クラスメソッド

Slide 25

Slide 25 text

MRTK Test Utilities を使ったテスト駆動開発入門 テストコードを書いたクラスの実装を行う(1) ① クラスとメソッドのみを用意する ② テスト実行 ( テスト失敗 : レッド )

Slide 26

Slide 26 text

MRTK Test Utilities を使ったテスト駆動開発入門 テストコードを書いたクラスの実装を行う(2) ① メソッドを実装する ② テスト実行 ( テスト成功 : グリーン )

Slide 27

Slide 27 text

MRTK Test Utilities を使ったテスト駆動開発入門 実際のテスト時の様子 (動画)

Slide 28

Slide 28 text

MRTK Test Utilities を使ったテスト駆動開発入門 グリーン (テスト成功) を維持しながら、リファクタリングを行う ① リファクタリングする ② テスト実行 ( テスト成功 : グリーン )

Slide 29

Slide 29 text

(まとめ) MRTK Test Utilities と テスト駆動開発 を試してみて 実際に テスト駆動開発 (TDD) を試してみた感想 良かった点 ・回帰テスト ( Regression Test : リグレッションテスト ) を行う場面で煩雑な作業を省略できる ・ソースコード変更後、繰り返し自動テストを行えるので、修正を加えやすい ・カバレッジ (テストコードの網羅率) 次第だが、ソースコードの不具合 (バグ) を特定するまでの時間が短縮される ・テストコードから書き始めるので、設計時により疎結合を意識するようになる ・テストコード & テスト駆動開発の知識がないと開発が進まない ・最初のうちはテストが正しく動作しているのか、テストのテスト (動作検証) が必要 ・再利用頻度の少ないソースコードではテストコードの価値が薄い (テストコードを書く場所を見極める必要がある) ・複雑な手の動きをコードベースで書くのはやや面倒な場面もある 完璧なテストは不可能なので、「十分に良いテスト」を書けるようまず触ってみるのが良い 難しかった点

Slide 30

Slide 30 text

https://docs.microsoft.com/en-us/dotnet/api/microsoft.mixedreality.toolkit.tests?view=mixed-reality-toolkit-unity-2020-dotnet-2.7.0 Microsoft.MixedReality.Toolkit.Tests Namespace Writing and running tests https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/contributing/unit-tests?view=mrtkunity-2021-05#play-mode-tests https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/release-notes/mrtk-25-release-notes?view=mrtkunity-2021-05#testutilities-package TestUtilities 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-package Test utilities package https://docs.unity3d.com/Packages/[email protected]/manual/getting-started.html Getting started with Unity Test Framework 参考文献 本資料作成時に、参考にさせていただいた技術書籍・Webサイト一覧 公式サイト 書籍 ・JUnit 実践入門 (技術評論社) ・Unity ゲーム プログラミング・バイブル 2nd (株式会社ボーンデジタル) ・レガシーコードからの脱却 (O’REILLY)

Slide 31

Slide 31 text

Qiita にも公開予定 本日、お話させていただいた内容を Qiita にも公開予定です。 こちらの QR コード から Qiita ページに飛べます。

Slide 32

Slide 32 text

ご視聴いただき、ありがとうございました! Thank you XR Kaigi 2021