[2022/8/10] コミックマーケット100で第2版を頒布します。こちらの記事を参照してください
Unityの標準テストフレームワークであるUnity Test Frameworkパッケージ*1の解説本を技術書典11向けに上梓しました。 ギリギリ審査が通って閉幕までに間に合いました(間に合ってない
BOOTHにも置いています。
内容は、Edit Mode/ Play Modeテストの特性、非同期テスト、アサーション(NUnit3の制約モデル)、カスタムアサーション、テストダブル、パラメタライズドテスト、Sceneやアセットのテスト、その他Tips。 と、ユニットテストとその周辺だけに絞った*2のですが135ページもあるこわい。
対象バージョンは Unity Test Frameworkパッケージ v1.1.27、Unity 2020.3.12f1、JetBrains Rider 2021.1です。 とはいえ、中心はUnity Test Frameworkパッケージですので、本書で紹介するほとんどの機能はUnity 2019.2以降で動作するはずです*3。
また、Riderについてはテスト実行方法やTipsの紹介程度ですので必須ではなく、Visual StudioやVisual Studio Code(VS Code)、もしくはVimなど、使い慣れたIDEをお使いいただけば大丈夫です。
ソフトウェアテストに関する用語は、原則としてJSTQB技術委員会による『ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2018V3.1.J03』および『ISTQB GLOSSARY Ver3.2(日本語版)』から解説を引用しつつ使用しています。 またテストダブルなどユニットテストの技法に関しては『xUnit Test Patterns』(xUTP)に準じています。
サンプルコードは下記リポジトリで公開しています。NUnit3の制約全網羅したりと、書籍よりむしろこっちが本体かもしれない。
目次の紹介
各章の内容は次のとおりです。
第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メソッドのテストについて。
第6章 アサーション
NUnit3の制約モデル(Assert.That)によるアサーション(テスト実行結果の検証)について、検証対象や目的に応じた最適な書きかたやTips、アンチパターンを紹介。
第7章 テストダブル
テスト対象が何らかのコンポーネントに依存しているとき(内部で生成した疑似乱数やサーバからのレスポンスに応じて結果が変わるなど)、その依存コンポーネントを偽物(スタブ、スパイ、モックなど)に置き換えてテストするテクニックの紹介。
第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のテストなど。
第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プラグインの紹介。
第14章 テスト実装のヒント
壊れやすい「実装のテスト」ではなく、変更に強い「仕様のテスト」を書くためのアプローチを紹介しています。 テストケースを導出するためのテスト技法(同値分割法・境界値分析・デシジョンテーブル・組み合わせテスト)、再現テスト、テスト駆動開発(TDD)。
付録A JetBrains Rider Tips
IDEにRiderを使う場合の、コグニティブ複雑度の計測(CognitiveComplexityプラグイン)、テスト用Live Templateの紹介。
付録B OpenUPM-CLI
本書で紹介しているUPMパッケージをUnityプロジェクトにインポートするのに便利なopenupm-cli
コマンドの紹介。
付録C NuGetForUnity
本書で紹介しているNuGetパッケージをUnityプロジェクトにインポートするのに便利なNuGetForUnityの紹介。
執筆を支える技術
以下、執筆に使用したツール類です。感謝しかない。
Re:VIEW
書名が長いのでこの記事を参考に大扉の折返しを調整しています。 kyabe.net
textlint
今回使用したルールは以下。
$ npm install --save-dev textlint \ textlint-rule-preset-ja-spacing \ textlint-rule-preset-ja-technical-writing \ textlint-filter-rule-comments \ textlint-filter-rule-allowlist \ textlint-rule-prh \ textlint-rule-abbr-within-parentheses \ textlint-rule-common-misspellings \ textlint-rule-spellchecker \ textlint-plugin-review
prh
prh (proofreading helper) は、表記ゆれなど校正を支援してくれるツールです。 ビルトインで十分に実績のあるルールが提供されていますが、今回執筆を進めながら、Unity、C#、JetBrains、ISTQB日本語版、xUTPに関する用語を追加しました。
追加したルールは下記リポジトリで公開しています。本書の範囲だけなので網羅にはほど遠いのですが、今後も育てていければと。
スクリーンショット用にウィンドウサイズを整えるAppleScript
スクショのサイズが統一されていないのは嫌なので、次のスクリプトでリサイズして撮影しました。
Unity用
Rider用
所感
元々はC98(2020年GW)に出そうと着手したのが、コミケ流れたり忙しかったりで1年半かかってしまいました。 当時は制限事項として書こうとしていたものが今は修正されていたり、Unity Test Frameworkも日々進歩していることをここ数週間の追い込みで実感したりできました。
本の執筆は5年ぶり、同人誌は初でした。 Re:VIEWやtextlint、prhなどツールが整っていて、手軽にそれなりに見られるものがレンダリングできてしまうのは素晴らしいですね。 もちろん、カスタマイズやレイアウトなど凝りたくなるとそこはプロの技が必要なわけですが。
ちなみに、審査に数日と聞いていたので開催期間中に間に合うか不安だったのですけれど、半日くらいで爆速審査していただけました。 技術書典スタッフの方々、本当にありがとうございました。
技術書典11は本日いっぱい開催です。電子書籍は明日以降も購入できますが、よい機会なので色々見てまわってはいかがでしょうか。
[追記]技術書典「第4回 刺され!技術書アワード」のファイナリストにノミネートされました! *4
#技術書典 「第4回 刺され!技術書アワード」大賞のファイナリスト(最終候補)24作品はこちらです🖊️https://t.co/cTB9OR4DMK pic.twitter.com/1frU42mOvG
— 技術書典 公式アカウント (@techbookfest) 2022年2月15日