やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Unity Test Framework完全攻略ガイド 第2版

Unityの標準テストフレームワークであるUnity Test Frameworkパッケージの解説本をコミックマーケット100の1日目(土曜日)西そ06b*1いか小屋」で頒布します。

昨年の技術書典11で頒布した第1版をベースに、テストダブルやテスト技法に関するセクションなどへの加筆修正のほか、プレビューリリースとされているUnity Test Frameworkバージョン2の変更点についても付録として収録しています。

想定読者

UnityでC#スクリプトを書けるレベルのソフトウェアエンジニア(プログラマー)を想定しています。 UnityやC#言語自体の解説はしていません。

ユニットテストに関しては入門レベルからカバーしています。

目次の紹介

各章の内容は次のとおりです。

第1章 テストとは何か

「テスト」と、ゲーム業界で使われる「デバッグ」という言葉の違いから、テストのターゲットに応じた考えかた、どのようなテストを自動化すべきか等。

第2章 Unity Test Frameworkの基本

Unity Test Frameworkパッケージを使ってユニットテストを書き、実行する手順を、順序立てて説明しています。 フォルダ(アセンブリ)構成や命名の指針も紹介しています。

第3章 Edit Modeテスト

主にロジックのテストに利用できるEdit Modeテストの特徴と、Edit Modeテスト固有の機能について。

第4章 Play Modeテスト

よりUnityプレイヤーに近い環境で動作させられるPlay Modeテストの特徴、Unityエディターおよびプレイヤーでの実行方法について。

第5章 非同期処理のテスト

コルーチンやUniTaskによるasyncメソッドのテストについて。

第2版では、Unity Test Framework v2.0でasync/awaitが使用できるようになることを踏まえ、表記の見直しを行ないました

v2.0.1(C101版)では、Unity Test Framework v1.3でasync/awaitのテストが前倒しサポートされたことを追記しました。 詳しくは次の記事を参照してください。[2023/1/1追記]

www.nowsprinting.com

第6章 アサーション

NUnit3の制約モデル(Assert.That)によるアサーション(テスト実行結果の検証)について、検証対象や目的に応じた最適な書きかたやTips、アンチパターンを紹介。

第7章 テストダブル

テスト対象が何らかのコンポーネントに依存しているとき(内部で生成した疑似乱数やサーバからのレスポンスに応じて結果が変わるなど)、その依存コンポーネントを偽物(スタブ、スパイ、モックなど)に置き換えてテストするテクニックの紹介。

第2版では、シーケンス図の見直し、サンプルコード掲載*2、NSubstituteについて詳細化を行ないました

第8章 パラメタライズドテスト

ひとつのメソッドを引数を様々に変えてテストしたいとき、NUnit3のTestCase属性・TestCaseSource属性・Values属性・ValueSource属性を使ってこれを実現する方法。

第9章 Unity Test Framework Tips

Unity Test Frameworkに備わる機能の紹介。 許容誤差付きのアサーション(EqualityComparer)、GCメモリアロケーション検知(AllocatingGCMemory)、ログ出力の検証(LogAssert)、テストの前処理・後処理(SetUp/TearDown属性, OneTimeSetUp/TearDown属性, PrebuildSetup/Cleanup属性, ICallbacks/IErrorCallbacksインタフェース)、アセットのロード、実行プラットフォーム制限(UnityPlatform属性)、カテゴライズ(Category属性)、タイムアウトの指定(Timeout属性)、MonoBehaviourのテストなど。

第2版では、UnitySetUp/TearDown属性のセクションを追加しました*3

第10章 Sceneを使用するテスト

Edit Modeテスト・Play Modeテスト(エディター実行)・Play Modeテスト(プレイヤー実行)それぞれで、Sceneファイルをロードしてテストに使用する方法。 "Scenes in Build"に含まれないSceneをロードする方法も紹介しています。

第11章 UPMパッケージのテスト

Unity Package manager(UPM)パッケージのテストを実装・実行する方法。

第12章 テストの実行方法

UnityエディターのTest Runnerウィンドウ、Jet Brains Rider、コマンドラインからのテスト実行方法・オプションの紹介。

第13章 コードカバレッジ

Unity Code Coverageパッケージを用いてコードカバレッジ(テストがプロダクトコードのどの部分をカバーしているかの指標)を採取する方法。 また、RiderのdotCoverプラグインの紹介。

v2.0.1(C101版)では、Code Coverageパッケージv1.2で変更されたコマンドライン引数に対応しています。詳しくは公式のUpgrade Guideを参照してください。[2023/1/1追記]

docs.unity3d.com

第14章 テスト実装のヒント

壊れやすい「実装のテスト」ではなく、変更に強い「仕様のテスト」を書くためのアプローチを紹介しています。 テストケースを導出するためのテスト技法(同値分割法・境界値分析・デシジョンテーブル・組み合わせテスト)、再現テスト、テスト駆動開発(TDD)。

第2版では、各テスト技法のモデル図、状態遷移テストおよび学習テストのセクションを追加しました

付録A JetBrains Rider Tips

IDEにRiderを使う場合の、コグニティブ複雑度の計測(CognitiveComplexityプラグイン)、テスト用Live Templateの紹介。

付録B OpenUPM-CLI

本書で紹介しているUPMパッケージをUnityプロジェクトにインポートするのに便利なopenupm-cliコマンドの紹介。

付録C Unity Test Framework v2.0

第2版で追加しました。現在プレビュー中であるv2.0の主な変更点をまとめています*4

変更点を特記していない章も、前提バージョンの変更や記述の見直しなどを実施しています。 ページ数では134から152と18ページ増ですが、原稿の行ベースで見ると約35%書き換わっています(git diff調べ)。

サンプルコード

サンプルコードは引き続き下記リポジトリを参照してください。

github.com

表紙について

C99の『Unity Automated QA攻略ガイド』に続き、りょふ彦(@ryofu1323)さんにファンタジーRPG風ユニティちゃんをお願いしました。

デフォルメも等身もかわいく描いていただけて、大変ありがたいです。

信販売・電子版について

[8/17] BOOTHにて電子版のアップデート配信を開始しました。 物理本は在庫なしです。ご希望の方は「入荷お知らせメールを受け取る」をクリックしてお待ち下さい。需要次第で増刷を検討します。 物理本の在庫復活しています[2023/1/1]

ikagoya.booth.pm

[8/22] 技術書典オンラインマーケットにて電子版のアップデート配信を開始しました。

techbookfest.org

なお、近日中にAmazonKindle版およびPOD版のリリースも予定しています。

その他

第1版の内容についてはこちらの記事を参照してください。

www.nowsprinting.com

既刊の『Unity Automated QA攻略ガイド』も若干数ですが持っていきます。 内容はこちらの記事を参照してください。

www.nowsprinting.com

[2023/5] 続編として『統合テスト編』を上梓しました。内容はこちらの記事を参照してください。

www.nowsprinting.com

*1:また日本Androidの会Unity部さんのお隣です! UNIBOOK14のついでにお立ち寄りください

*2:サンプルコードリポジトリには例がありましたが、今回一部変更した上で本文にも掲載しています

*3:なぜか漏れていました…

*4:元々の予定ではUnity 2022.2から正式採用のはずだったのですが、5月に延期がアナウンスされました