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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Atsushi Okui
February 15, 2026
Programming
0
6
モックを適切に使ったテスト
* ソフトウェアテストにおける「モック」とは何か
* モックのメリット・デメリット
* モックの適切な使い方
Atsushi Okui
February 15, 2026
Tweet
Share
More Decks by Atsushi Okui
See All by Atsushi Okui
カバレッジとは?
a_okui
0
9
私のテストコードの書き方
a_okui
0
14
プログラミングどうやる? ~テスト駆動開発から学ぶ達人の型~
a_okui
0
440
『Accelerate State of DevOps Report 2022』翻訳とまとめ
a_okui
0
2.5k
コード品質がもたらすビジネスへの影響(社内向け翻訳、まとめ)
a_okui
0
390
『Accelerate State of DevOps Report 2021』翻訳とまとめ
a_okui
0
630
Other Decks in Programming
See All in Programming
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
450
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
490
モジュラモノリスにおける境界をGoのinternalパッケージで守る
magavel
0
3.5k
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
700
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
0
210
AIプロダクト時代のQAエンジニアに求められること
imtnd
2
740
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
460
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
4
480
株式会社 Sun terras カンパニーデック
sunterras
0
2k
受け入れテスト駆動開発(ATDD)×AI駆動開発 AI時代のATDDの取り組み方を考える
kztakasaki
2
540
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
250
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
230
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Being A Developer After 40
akosma
91
590k
Marketing to machines
jonoalderson
1
5k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
97
Paper Plane
katiecoart
PRO
0
47k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
A designer walks into a library…
pauljervisheath
210
24k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
How STYLIGHT went responsive
nonsquared
100
6k
The SEO Collaboration Effect
kristinabergwall1
0
380
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
850
KATA
mclloyd
PRO
35
15k
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?
完