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
モックを適切に使ったテスト
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Atsushi Okui
February 15, 2026
Programming
0
0
モックを適切に使ったテスト
* ソフトウェアテストにおける「モック」とは何か
* モックのメリット・デメリット
* モックの適切な使い方
Atsushi Okui
February 15, 2026
Tweet
Share
More Decks by Atsushi Okui
See All by Atsushi Okui
カバレッジとは?
a_okui
0
0
私のテストコードの書き方
a_okui
0
8
プログラミングどうやる? ~テスト駆動開発から学ぶ達人の型~
a_okui
0
430
『Accelerate State of DevOps Report 2022』翻訳とまとめ
a_okui
0
2.5k
コード品質がもたらすビジネスへの影響(社内向け翻訳、まとめ)
a_okui
0
380
『Accelerate State of DevOps Report 2021』翻訳とまとめ
a_okui
0
620
Other Decks in Programming
See All in Programming
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
260
AIフル活用時代だからこそ学んでおきたい働き方の心得
shinoyu
0
140
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
22
7.5k
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
620
生成AIを活用したソフトウェア開発ライフサイクル変革の現在値
hiroyukimori
PRO
0
110
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.9k
CSC307 Lecture 10
javiergs
PRO
1
670
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
160
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
2026年 エンジニアリング自己学習法
yumechi
0
140
Amazon Bedrockを活用したRAGの品質管理パイプライン構築
tosuri13
5
810
ノイジーネイバー問題を解決する 公平なキューイング
occhi
0
110
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
120
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
230
GitHub's CSS Performance
jonrohan
1032
470k
Writing Fast Ruby
sferik
630
62k
Are puppies a ranking factor?
jonoalderson
1
2.7k
Accessibility Awareness
sabderemane
0
61
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
160
How GitHub (no longer) Works
holman
316
140k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.6k
The SEO identity crisis: Don't let AI make you average
varn
0
330
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Transcript
モックを 適切に使ったテスト
自己紹介 Atsushi Okui (@blue32a_jp) ソフトウェアエンジニア / Webアプリケーション エンジニア / PHPer
関心:設計、コード品質、リファクタリング、テス ト、モデリング
今回のテーマ • ソフトウェアテストにおける「モック」とは何か • モックのメリット・デメリット • モックの適切な使い方
ソフトウェアテストにおける 「モック」とは何か
一般的な場面での「モック」 モック(Mock)/モックアップ(Mock)とは、 ”製品の外観の検討や機能の確認のためにつくられる原型。” – Wikipedia https://ja.wikipedia.org/wiki/木型
ソフトウェアテストにおける「モック」 ”モックとは、(略)、テスト対象システム(System Under Test: SUT)とその協力者オブ ジェクトのやり取りを検証するのに使われるテスト・ダブルのことです。” – 『単体テストの考え方/使い方』
テストダブル (Test Double) とは ”テストダブルとは、自動テストに使用する偽物、代用品のことです。たとえば、データ ベースや外部サービスの動作を模倣した偽物(テストダブル)を作り、自動テストから使 います。” – 第4回 テストダブル
~忠実性と決定性のトレードオフを理解する~ https://gihyo.jp/dev/serial/01/savanna-letter/0004 ※スタントマン/スタントダブル(Stunt Double)からきている。
テストダブルの5つの分類 • スタブ:テスト対象への間接入力を操作 • スパイ:テスト対象の間接出力の記録 • モック:テスト対象の間接出力の検証 • フェイク:間接入出力の検証以外の目的での置き換え •
ダミー:テスト対象が要求しているがテストに影響与えない それぞれの詳しい説明はこちら👇 xUTPによるテストダブルの定義とその図解 https://engineers.ntt.com/entry/20251208_advent-calendar-day8/entry
広義のモック、狭義のモック 広義のモック:テストダブル 狭義のモック:テストダブルの分類の一つであるモック — 『テスト駆動開発』 付録C 訳者解説
複数の意味を持つ「モック」 ”「モック」という言葉は複数の意味があり、状況によっては異なる意味で使われることが あります。(略)、モックはテスト・ダブルの中の1つに過ぎないのですが、「モック」という 用語がすべてのテスト・ダブルに対して扱われる傾向があります。さらに「モック」はテス ト・ダブルの意味では用いられず、モック・ライブラリから提供されるモック・オブジェクトを 作成するためのクラスのことを意味することがあります。” – 『単体テストの考え方/使い方』
まとめ:ソフトウェアテストにおける「モック」とは • 多くは、自動テストで使用される代用品(テストダブル)のことを指す • 場合によっては、テストダブルの分類の1つであったり、テストダブルを作成するた めのツールを指していることもある • テストダブルは、用途によって5つに分類される この資料では、特別な場合を除いてモック=テストダブルの意味で扱います。 「モック」が何を指すか分かったところで、次はモックを適切に扱うためにメリット・デメリッ
トを確認していきます。
モックのメリット
メリット1:テストの実行速度が向上する 例えば次のような処理をモックに置き換えることで実行速度を向上させることが期待でき ます。 • ネットワーク通信や外部リソースを使用する処理 • 大きなデータを操作する処理
メリット2:テストの決定性が向上する 决定性とは、同じ入力に対しては常に同じ結果を返す性質です。次のような不安定な動 作をする処理をモックに置き換えることで、再現性のあるテストが実施できます。 • ネットワーク通信など何らかの理由で失敗することがある処理 • ランダム性のある処理 • 現在時刻を使用した処理
メリット3:テストしにくいものがテスト可能になる 次のような自動テストするのが難しい処理をテスト可能にすることができます。 • 本番以外で実行できない処理 • 例外系など再現が難しい処理 • 入力の制御や出力の観測が直接できない処理 ◦ メール送信など、結果が外部へ向かうために観測できないもの
◦ 設計に課題があり、直接制御できないもの(テスト容易性が低い)
モックのデメリット
デメリット1:テストコードが長くなる 代用品としての振る舞いを決めたり、テスト対象からの間接入力を検証したりなど、準備 フェーズのコードが長くなりがちになります。
デメリット2:検証(Assert)が分散する テストコードをAAAパターン(*1)で構成することで分かりやすくすることができますが、 モックを準備する段階に検証のコードが入りがちになります。 *1 準備(Arrange)、実行(Act)、検証(Assert)の3つのフェーズで構成する
デメリット3:テストが壊れやすくなる テスト対象が内部的に使う依存を制御するので、実装の詳細がテストに漏れ出ていきま す。これにより、振る舞いを変えずに実装を変えるリファクタリングするにはテストも変更 することになり、リファクタリングへの耐性(*1)が低下することになります。 *1 『良い単体テストの4本の柱』
デメリット4:本物の動きと同一である保証はない テストダブルの動作は開発者の想定で決めていくので、本物が同じように動く保証はあ りません。また本物の動作が変更された時、モックはその変更に追従してくれません。
デメリット5:テストしにくいものがテスト可能になる これはメリットでもありますが、デメリットでもあります。 「テストしにくい」という状態は設計に課題を抱えていることがあります。しかしながら、 モックライブラリがあまりに強力なため、本来であれば「設計を改善する」という選択を検 討したいところを「モックを使ってテストする」という方へ向かいがちになります。
モックの泥沼 ”ここで言うモックの泥沼とは、ユニットテストのコードがモックに埋め尽くされていまい、もともとのテストが ほとんど意味をなさなくなっている状態のことを指します。(略)。この泥沼の力は強大です。開発の効率を 上げてくれるはずだったテスト自体が逆にあなたを苦しめ、作業速度を落とします。雑多な情報が多すぎ て、テストで想定していた正しい動作がどんなものだったのかが、もはやわかりません。わかることはただ 1つ、何か変更を加えようとすると、何かが壊れることだけです。そして設計を改善するのは苦行となり、誰 も改善をしなくなります。” – 『初めての自動テスト』
経験談 最初にテストを自動化したときは、テストや設計に関する知見が少なく、それを補うかの ようにモックを使っていました。そんな中でこのような疑問が生まれました。 「テストは全てパスしたが、本番環境でも正しく動くだろうか?」 残念ながらこの疑問に自信を持って答えられる状況ではありませんでした。 テストには「どれだけやれば十分」といった正解はありません。抽象的ですが「テストの 結果に自信が持てるかどうか」が一つの指標になります。モックは便利なものですが、 対価として「テストへの自信」を支払うことになります。
まとめ:モックのメリット・デメリット • メリットは「テストの実行が容易になる」 • デメリットは「保守性やテストの信頼性が低下」 • 「テストしにくいものがテスト可能になる」は諸刃の剣 • モックを多く使うほど、自動テストの利点を失うことになる モックのメリット・デメリットが確認できたところで、最後にモックの適切な使い方を考えて
いきます。
モックの適切な使い方
モックを使わずに済むなら、そのほうがいい 前のセクションで確認したように、モックにはメリットだけではなくデメリットもあります。 モックを使わずに課題を解決できるならそれに越したことはありません。 そこで、モックを利用することで得たいメリットについて、他の選択肢を考えていきましょ う。
1:テストの実行速度を向上させたい • テストの実行を並列化できないか • 遅いテストの実行タイミングを工夫できないか(テストのグループ化やスケジュール 実行) • 設計を改善し「遅い処理」への依存を減らせないか • コンテナ技術を活用し、外部依存を同じマシンで実行できないか
2:テストの决定性を向上させたい 本物が不安定であることから、安定したモックへの代替以外の解決策としては次のよう なものになります。 • 設計を改善し「决定性が低い処理」への依存を減らせないか 例えば、ランダムな値を出力する乱数生成器に直接依存するのではなく、そこから生成 した値だけを使う形にするような構造を検討します。
3:テストしにくいものをテストしたい • 本番と同等、または限りなく近い環境を用意できないか • 外から見える振る舞いだけでテストできないか • テストしやすい構造にできないか 前述の通り「テストしにくい」状態は設計に課題がある場合があります。そうした課題が ないか確認し、積極的に改善する方法を検討します。
テスト対象のシステムから「直接制御できない外部の依存」は有効な置き換え対象にな ります。「直接制御できない外部の依存」の具体的な例はメールサービスです。メール サービスに対するリクエストは観察することができますが、実際にメールを送信する過程 は観察することができません。 ”モックに置き換えるべき依存は管理化にない依存、つまり、外部アプリケーションから観 察可能な依存だけになります。” – 『単体テストの考え方/使い方』 モックへの置き換えが有効なもの
まとめ • 「モック」の多くは自動テストで使用される代用品(テストダブル)のことを指すが、テ ストダブルの分類の1つやモックライブラリなどのツールを指している場合もある • メリットは「テストの実行が容易になる」、デメリットは「保守性やテストの信頼性が低 下」 • 「テストしにくいものがテスト可能になる」はメリットであり、デメリットでもある •
モックを多く使うほど、自動テストの利点を失うことになる • モックを使わずに解決する方法も検討する
How do you like Testing?
完