Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
自動テストでモックするって、なにそれ?おいしいの?/what_is_mocking
Search
marchin
April 14, 2022
Programming
1.3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
自動テストでモックするって、なにそれ?おいしいの?/what_is_mocking
marchin
April 14, 2022
More Decks by marchin
See All by marchin
ブラックフライデーで購入したPixel9で、Gemini Nanoを動かしてみた
marchin1989
1
820
Amazon Athenaで気軽に始める データ分析/athena-data-analytics
marchin1989
0
630
WebAPI開発のためのOpenAPI入門/entry-open-api
marchin1989
1
1.4k
AWS Glueではじめるデータレイク
marchin1989
0
740
やさしく入門するOAuth2.0/easy-entry-oauth
marchin1989
8
2.8k
1時間半で克服するJavaScriptの非同期処理/async_javascript_kokufuku
marchin1989
2
1.6k
たぶんもう怖くないGit/maybe-not-afraid-of-git-anymore
marchin1989
2
2.7k
モバイルアプリで機械学習入門/introduction-to-machine-learning-in-mobile-app
marchin1989
0
540
Other Decks in Programming
See All in Programming
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
220
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
200
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.4k
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
yield再入門 #phpcon
o0h
PRO
0
180
霧の中の代数的エフェクト
funnyycat
1
370
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
170
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
AIエージェントで 変わるAndroid開発環境
takahirom
2
610
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
110
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
140
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
850
Featured
See All Featured
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
350
Building the Perfect Custom Keyboard
takai
2
810
Unsuck your backbone
ammeep
672
58k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
490
The Language of Interfaces
destraynor
162
27k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
Side Projects
sachag
455
43k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
220
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
630
Transcript
自動テストでモックするって、 なにそれ?おいしいの? 〜依存コンポーネントをコントロールして、上手なテストコードを実装しよう〜
自己紹介 - 名前: 阿部 真之 - 仕事: 株式会社ゆめみ でAndroidエンジニアしてます -
最近はサーバサイド Kotlinの仕事も始めました - 趣味 - コーヒー、ビール、アニメ、ゲーム、読書、 etc… - Twitter: @marchin_1989
アジェンダ - ユニットテストの例 - テストダブルとは - テストダブルの分類(サンプルコードで解説) - その他注意点など
ユニットテスト書いてますか?
ユニットテスト コンピュータプログラミングにおいて単体テスト(たんたいテスト)あるいはユニットテスト (英語: Unit test)とは、ソースコードの個々のユニット、すなわち、1つ以上のコンピュー タプログラムモジュールが使用に適しているかどうかを決定するために、関連する制御 データ、使用手順、操作手順とともにテストする手法である。ユニットとはアプリケーショ ンのテスト可能な最小の部品単位である、と直観的にとらえることができる。 (Wikipedia) ここでは、自動テストの文脈でユニットテストをみていきます。
ユニットテストしてみよう
- テストダブルってなに? - モック、スパイ、ダミーとか聞いたことあるけど。。 テストダブル?
テストダブルとは? - テストダブルとは、テスト実行時に、テスト対象が依存している外部のコンポーネン トと置き換わるもの。 @Test fun `テストコード`() { assertEquals(期待値, テスト対象())
} fun テスト対象(): Int { … 依存コンポーネントのメソッド() … }
本番 テスト
なぜテストダブルに置き換えたいのか テスト対象が外部のコンポーネントに依存しており、テスト環境で利用できなかったり、 利用しづらかったりなど、制約(コスト、処理時間)があるとき。 - テストに必要な結果をコントロールできない(実行するたびに値が変わる) - 実行に時間がかかる - 用意するのにお金がかかる
テストダブルにはどんなものがあるの? - xUnit Test Patternsによる定義、分類が有名 - xUnit Test Patternsとは、テスト自動化フレームワークの xUnit(JUnitやNUnitなど)を使用して自動
テストを作成するためのパターン (本)。 - 分類 - ダミー(Dummy Object) - スタブ(Test Stub) - スパイ(Test Spy) - モック(Mock Object) - フェイク(Fake Object) 出典: xUnit Test Patterns Test Double http://xunitpatterns.com/Test%20Double.html
テストダブルの分類を知っておく利点 - それぞれの役割を理解しておくと、テストダブルに対して何をやらせばいいのか明 確になる。適切なテストダブルを選べる。 - モックライブラリのAPIが何を提供しているのか理解しやすくなる。 - ただし、xUnit Test Patternsのテストダブルの分類と言葉が一致しなかったりするので要注意。
- (逆説的だが)自分が作成したいテストケースが明確になる。
以降の説明の流れ - テストダブルとその分類 - それぞれ、実際にどうやって置き換えるのか、サンプルコードで紹介(Kotlin)
テストダブルの分類
外部からの入力 外部への出力 主な役割 ダミー × × 何もしない。インスタンスが必要になる場合に利用。 スタブ ◯ ×
外部コンポーネントからの入力を操作する スパイ ◯ ◎ 外部コンポーネントへの出力を記録する 出力結果をテストコードから取り出して評価 モック ◯ ◎ 外部コンポーネントへの出力を記録する 出力の期待結果を持ち、モック内で評価 フェイク ◯ ◯ 本物ではないが、本物と同じように動作する テストダブルの分類
外部からの入力 外部への出力 主な役割 ダミー × × 何もしない。インスタンスが必要になる場合に利用。 スタブ ◯ ×
外部コンポーネントからの入力を操作する スパイ ◯ ◎ 外部コンポーネントへの出力を記録する 出力結果をテストコードから取り出して評価 モック ◯ ◎ 外部コンポーネントへの出力を記録する 出力の期待結果を持ち、モック内で評価 フェイク ◯ ◯ 本物ではないが、本物と同じように動作する テストダブルの分類 主に「外部への入出力」でテ ストダブルを分類
外部からの入力 外部への出力 主な役割 ダミー × × 何もしない。インスタンスが必要になる場合に利用。 スタブ ◯ ×
外部コンポーネントからの入力を操作する スパイ ◯ ◎ 外部コンポーネントへの出力を記録する 出力結果をテストコードから取り出して評価 モック ◯ ◎ 外部コンポーネントへの出力を記録する 出力の期待結果を持ち、モック内で評価 フェイク ◯ ◯ 本物ではないが、本物と同じように動作する テスト対象への入力 のコントロール テストダブルの分類
外部からの入力 外部への出力 主な役割 ダミー × × 何もしない。インスタンスが必要になる場合に利用。 スタブ ◯ ×
外部コンポーネントからの入力を操作する スパイ ◯ ◎ 外部コンポーネントへの出力を記録する 出力結果をテストコードから取り出して評価 モック ◯ ◎ 外部コンポーネントへの出力を記録する 出力の期待結果を持ち、モック内で評価 フェイク ◯ ◯ 本物ではないが、本物と同じように動作する テスト対象からの出 力の記録 テストダブルの分類
ダミー
ダミー(Dummy Object) - テストメソッド内で、なにもしない。 - テスト対象に影響を与えないが、コンパイルなどの都合上、用意しないといけないも の。
ダミーのサンプルコード
スタブ
スタブ(Test Stub) - 入力を操作し、任意の値をテスト対象に与える。 - 入力値をテストコード上で、事前設定し、テストを実行。
スタブのサンプルコード
スパイ
スパイ(Test Spy) - テスト対象からの出力を記録。 - テストコード上でその記録した出力を検証する。 - ただし、入力を操作することもある。つまりスタブのように振る舞うこともある。
スパイのサンプルコード
モック
モック(Mock Object) - テスト対象からの出力を記録 - テスト対象内の外部コンポーネントへの出力の期待結果(expected)をセットする - テスト対象を実行しながら、テスト対象から外部コンポーネントへの出力を取得し、 モック内部で期待結果と出力結果を比較して、成功か失敗かを判定する -
テストコードからは、モックから検証の成功 or 失敗を受け取る - スタブの機能を持つことがある
スパイとモックの違い - 両方とも、外部コンポーネントへの出力を検証するためのテストダブル。 - ただし、モックは、テスト対象のメソッドを呼び出す前に、事前に期待結果をセットす る。その後、モック内で出力の結果を評価する。 - スパイは、外部コンポーネントへの出力を保持するだけ。外部コンポーネントへの 出力結果の評価は後からテストコード上で行う。
フェイク
フェイク(Fake Object) - テスト実行中、本物ではないが、本物と同じように動作する。 - 本物がテスト環境で使えないとか、返答が遅いなどの理由で利用する。 - テストの実行環境のマシンで起動しておいて、接続先を変更するなどで置き換える - 例
- RDBに対し、同じ機能を持ったオンメモリのデータベース。 - AWSの機能をエミュレートした LocalStack。DynamoDB Local。
以上、テストダブルの分類でした
その他 - ややこしいが、テストダブルの生成を単に「モックする」ということがある。
その他 - ややこしいが、テストダブルの生成を単に「モックする」ということがある。 - 「スタブの入力値自体をテストする」のような意味のないユニットテストを書いてしま うことがあるので注意。
その他 - ややこしいが、テストダブルの生成を単に「モックする」ということがある。 - 「スタブの入力値自体をテストする」のような意味のないユニットテストを書いてしま うことがあるので注意。 - テストダブルは、まだ実装していないコードの代替となる。
その他 - ややこしいが、テストダブルの生成を単に「モックする」ということがある。 - 「スタブの入力値自体をテストする」のような意味のないユニットテストを書いてしま うことがあるので注意。 - テストダブルは、まだ実装していないコードの代替となる。 - モックライブラリで実装されている名前と、xUnit
Test Patternsのテストダブルの分 類は必ずしも一致しない
その他 - ややこしいが、テストダブルの生成を単に「モックする」ということがある。 - 「スタブの入力値自体をテストする」のような意味のないユニットテストを書いてしま うことがあるので注意。 - テストダブルは、まだ実装していないコードの代替となる。 - モックライブラリで実装されている名前と、xUnit
Test Patternsのテストダブルの分 類は必ずしも一致しない - モックライブラリによっては挙動が異なるので、利用するときはよく挙動を理解して おくこと - rspec-mocks(Ruby)のスパイは、置き換えられた本物の依存コンポーネントの処理は実行されな い - MockK(Kotlin)やJest(JavaScript)のスパイは、デフォルトだと、置き換えられた依存コンポーネン トの処理も実行される。プロキシのような挙動。
外部からの入力 外部への出力 主な役割 ダミー × × 何もしない。インスタンスが必要になる場合に利用。 スタブ ◯ ×
外部コンポーネントからの入力を操作する スパイ ◯ ◎ 外部コンポーネントへの出力を記録する 出力結果をテストコードから取り出して評価 モック ◯ ◎ 外部コンポーネントへの出力を記録する 出力の期待結果を持ち、モック内で評価 フェイク ◯ ◯ 本物ではないが、本物と同じように動作する まとめ テスト対象への入力 のコントロール テスト対象からの出 力の記録