Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Zenject Testing LT
Search
Nozomi Tanaka
September 06, 2018
Technology
0
1.4k
Zenject Testing LT
Nozomi Tanaka
September 06, 2018
Tweet
Share
More Decks by Nozomi Tanaka
See All by Nozomi Tanaka
Gotanda.unity #10 メモリと闘う者達 〜GC編〜
barasixi
0
3.3k
Other Decks in Technology
See All in Technology
Uncertainty in the LLM era - Science, more than scale
gaelvaroquaux
0
840
エンジニアとPMのドメイン知識の溝をなくす、 AIネイティブな開発プロセス
applism118
4
1.2k
直接メモリアクセス
koba789
0
290
Ruby で作る大規模イベントネットワーク構築・運用支援システム TTDB
taketo1113
1
260
5分で知るMicrosoft Ignite
taiponrock
PRO
0
340
ガイドラインを軸にしたウェブアクセシビリティ改善
lycorptech_jp
PRO
1
100
非CUDAの悲哀 〜Claude Code と挑んだ image to 3D “Hunyuan3D”を EVO-X2(Ryzen AI Max+395)で動作させるチャレンジ〜
hawkymisc
1
170
eBPFとwaruiBPF
sat
PRO
4
2.6k
RAG/Agent開発のアップデートまとめ
taka0709
0
160
大企業でもできる!ボトムアップで拡大させるプラットフォームの作り方
findy_eventslides
1
710
SSO方式とJumpアカウント方式の比較と設計方針
yuobayashi
7
600
多様なデジタルアイデンティティを攻撃からどうやって守るのか / 20251212
ayokura
0
420
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
Faster Mobile Websites
deanohume
310
31k
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Designing Experiences People Love
moore
143
24k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.2k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Fireside Chat
paigeccino
41
3.7k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
[SF Ruby Conf 2025] Rails X
palkan
0
510
Transcript
Zenjectの機能をご紹介 〜テストの巻〜 2018/09/06 Nozomi Tanaka @nozomin770
自己紹介 • 名前 Tanaka Nozomi ◦ メインクラス:Unityつかい ◦ サブクラス:Ruby on Railsつかい
◦ ソシャゲをつくるおしごとをしています • Twitter : https://twitter.com/nozomin770 • キックボードに乗ることにハマった テストコードの書き方極めるのにハマってます
想定する読者 • すでにテストを完全に理解した方 • さらにZenjectをそれとなく理解した方 • Zenject無しでテストは書けるぜ! って方 • ここまでの発表を完全に理解してZenjectを使いこなせる方 •
さらなる自動テストを目指す方
えっ・・・
もくじ的なもの • ZenjectがサポートしているUnityのテスト手法 • ZenjectUnitTestFixtureとは • ZenjectIntegrationTestFixtureとは • SceneTestFixtureとは •
幻の第四のテスト • まとめ
Zenjectでテスト…とな?
そもそもZenjectでテストって一体 • ZenjectがUnityTestToolsにサポートを入れてくれている、ということ。 • EditModeTestはもちろん、PlayModeTestにもサポートが入っている • さらに、SceneTestという、Zenjectの権能を使うTestを書くことができる • Zenjectを組み込んだプロジェクトは、テストコードでも Zenjectの意思に従うことができるのだ・・・
ZenjectUnitTestFixtureという力
ZenjectUnitTestFixture • Zenjectが用意してくれているクラス • 中身は非常にシンプル、継承して使う
ZenjectUnitTestFixture • このクラスを使うとできること ◦ UnityTestToolsのEditModeTestを記述するときに、Zenjectの機能を使える • 具体的には… ◦ [SetUp]時にテストしたいクラスを Bindしておき
◦ [Test]を書いたテストケースごとに Resolveでインスタンスを取得できる • さらに… ◦ SetUpで事前にInjectしておくことで、各テストケースでインスタンス準備を省ける
ZenjectUnitTestFixture • これらを活用することで出来ること ◦ EditModeTestに対応できるC#のPureClassをテストするとき、DIを行うことができる ◦ テストに使うモッククラスを事前に Bindしておくことで、Zenjectが依存性を解決 ◦ モックオブジェクトを用意して
Resolveで食わせる設定をすることも可能 • 単体クラスのテストでは強みは薄いが、こういったケースでは強い ◦ 複数のマスターデータを使う、ビジネスロジックのテスト ▪ マスターデータはZenjectが全てDIしてくれるので、テストコード量が減る ▪ 工夫すれば都度Resolveでもらうモックの内容を差し替えることも可能 …
ZenjectIntegrationTextFixtureという力
ZenjectIntegrationTestFixture • このクラスを使うとできること ◦ PlayModeTestを実行するときにZenjectの権能を使うことができる • 具体的には… ◦ このクラスを継承すると、 [UnityTest]を実行するときにZenjectの権能が発揮される
◦ テスト実行時に3箇所のタイミングでZenjectの処理などを挟むことができる ◦ PlayModeTestなので、ContextやInstallerなどはすべて動作してくれる • ようするに、PlayModeTestでZenject使えるマン
ZenjectIntegrationTestFixture • これらを活用することで出来ること ◦ PlayModeTestでZenjectが動く!(語彙消失) ◦ PreInstallというメソッドを呼ぶ前に、 PlayModeで使うシーンを指定したり、シーンに操作が加えら れる ◦
PostInstallというメソッドを呼ぶ前に、テストに必要なバインド処理を記述できる つづく
ZenjectIntegrationTestFixture • これらを活用することで出来ること 2 ◦ PostInstallメソッドを呼んだ後、 Zenjectの処理がすべて起動する ◦ IInitializable.Initializeも呼ばれる ◦ このあとにテストが記述できる
◦ この瞬間はMonoVehaviour.Awakeのタイミングなので、 Startも呼ぶには一度yieldしておくこと つづく
ZenjectIntegrationTestFixture • つまりどういうことだってばよ ◦ 基本的なPlayModeTestの実行時に、Zenjectの全機能が起動可能 ◦ PostInstall前にバインド処理を自分で記述することで、 PlayModeTestでモックを参照させることも できる •
ところがどっこい、SceneTestのが強いので、こっちを使うのは稀かも?
SceneTestFixture…?
SceneTestFixtureという深淵 • こやつはいったい ◦ これを継承したクラスでも、 PlayModeTest時にZenjectの権能が使える ◦ Zenjectの神の力「StaticContext」を使うことで、Testするときに自在なパラメータを注入してしまう ことができる •
やばい
SceneTestFixtureヤバイ • やれることのベースはIntegrationTestと同じだが、思想が違う • テストのSetUpから権能を発揮しているので、自在にContextに操作が加えられる • StaticContextが所有するコンテナにBindを行うと、SceneContextが持つ InstallerでBindしたインスタンスを上書きしてBindされます • これを使うと・・・
SceneTestFixtureヤバイ • Zenjectで構築されたインゲームに対してデータ注入したテストができる ◦ 例:シューティングゲームで敵の速さを数段階設定、意図した結果になったかテスト ◦ 例の例:敵が弱い設定を注入したとき、プレイヤーは勝利する ◦ 例の例:敵が強い設定を注入したとき、プレイヤーは敗北する •
実データを投入したテストで、例外が出ないか検知するテストができる ◦ PlayModeTestを完全に使いこなすことで、自動テストを構築したのち ◦ 実データを投入、それを実行したときにエラーが出ないかテストできる ◦ 毎日回すとエラーが出たときにすぐ分かる!
Zenjectこそ神の意志
SceneTestFixtureヤバイ • 自動テストを構築しましょう ◦ まずはそこから。SceneTestFixtureを使ったテストを作成 ◦ 運用データを投入、たとえばゲームのホーム画面が出るまで、エラーが出ないことをテスト • Zenjectの権能で検証データを注入しましょう ◦
StaticContextの権能を使えば、あらゆる Containerに干渉できます ◦ 思いっきり検証用のデータを作りまくりましょう ◦ なんならマスターデータから自動でテストコードを作りましょう(真顔) • すると不思議、オートテストができる!!!
ちょっとまてや • 入力はどうすんだよ??? ◦ 悩みどころですね。Zenjectができるのはあくまで DIまで。 ◦ Zenjectが注入するオブジェクトはテストで自在に変えられますが、結局それまで。 ◦ テスト完全に理解した人たちなら、
PlayModeTestで入力をyieldで待つくらい出来るよ!
とはいえ凄い • テストコードを真面目に書くと感じると思うこと ◦ テストデータの用意がめんどう ◦ テストデータの依存解決も面倒 ▪ これはテストに限らないので、 Zenjectを使うわけですね
◦ Zenjectを使うとテストですら依存解決を Zenjectがしてくれる ◦ しかも、用意するテストデータは Bind時に個別につくればよい ▪ いっそテストケースごとに使うデータを全部 BindしてID指定もあり ▪ もちろんテストケースごとに Bind処理を書くのもあり ▪ データを用意することに注力できるのは、テスト工数の削減につながるねん
幻の第四のテスト
None
完全に理解した (わかってない)
User Driven Test Bedsって… • 手で動かしてねということ • 立派なテストです(と公式が言ってる) • 自動でできないのが難点・・・
• 見なかったことにしましょう
うまい感じに使うまとめ
まとめ • EditModeTestでZenjectを使いたいなら、UnitTestFixtureを使おう ◦ UnitTestと言ってるけどEditModeでIntegrationTestする場合も使える • PlayModeTestでは、まずはIntegrationTestFixtureを使おう ◦ 動作に慣れましょう。基本的には Play時と同じですが、PlayModeTestの書き方に慣れよう
• 自動でPlayModeTestを流したくなったそこのあなた、SceneTestを使おう ◦ 自動テスト環境の構築からはじめるんですけどね!!! ◦ 一度作ればユートピア、データを注入し放題〜〜〜
自動テスト環境を作れるほど テスト理解してたら 苦労しないよ・・・
〜FIN〜