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
駆け足で Google から学ぶテスト設計の指針
Search
ryounasso
August 25, 2025
Programming
180
0
Share
駆け足で Google から学ぶテスト設計の指針
ryounasso
August 25, 2025
More Decks by ryounasso
See All by ryounasso
明日から始めるリファクタリング
ryounasso
0
200
React inside basics: learn from “build own react"
ryounasso
0
190
抽象データ型について学んだ
ryounasso
0
390
開発効率向上のためのリファクタリングの一歩目の選択肢 ~コード分割~ / JJUG CCC 2024 Fall
ryounasso
0
3.8k
Clean Architecture by TypeScript & NestJS
ryounasso
0
1.1k
Fast API を用いた Web API の開発
ryounasso
1
610
テストゼロの個人開発プロジェクトにテストを導入した話
ryounasso
0
470
簡易 DI コンテナを作って DI コンテナを知る
ryounasso
1
1.4k
TypeScript_コンパイラの内側に片足を入れる
ryounasso
3
910
Other Decks in Programming
See All in Programming
煩雑なSkills管理をSoC(関心の分離)により解決する――関心を分離し、プロンプトを部品として育てるためのOSSを作った話 / Solving Complex Skills Management Through SoC (Separation of Concerns)
nrslib
4
870
レガシーPHP転生 〜父がドメインエキスパートだったのでDDD+Claude Codeでチート開発します〜
panda_program
0
710
forteeの改修から振り返るPHPerKaigi 2026
muno92
PRO
3
270
Swift Concurrency Type System
inamiy
0
480
今年もTECHSCOREブログを書き続けます!
hiraoku101
0
250
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
330
セグメントとターゲットを意識するプロポーザルの書き方 〜採択の鍵は、誰に刺すかを見極めるマーケティング戦略にある〜
m3m0r7
PRO
0
500
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
260
Nuxt Server Components
wattanx
0
270
Kubernetes上でAgentを動かすための最新動向と押さえるべき概念まとめ
sotamaki0421
3
480
Go_College_最終発表資料__外部公開用_.pdf
xe_pc23
0
200
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
150
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.7k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
160
Paper Plane (Part 1)
katiecoart
PRO
0
6.6k
Side Projects
sachag
455
43k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.2k
Building an army of robots
kneath
306
46k
We Are The Robots
honzajavorek
0
210
Visualization
eitanlees
150
17k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
120
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
Transcript
駆け足で Google から学ぶテスト設計の指針
「Googleのソフトウェアエンジニアリング」本の 11 ~ 13 章を読み、テスト・ユニット テストに関する重要な点を学んだ。 11章:テスト概観 12章: ユニットテスト 13章:
テストダブル
学んだこと テスト文化とその意義 テストの分類と設計方針 曖昧さをなくすテストの分類方法 理想のテストピラミッド 保守性の高いユニットテストを書くためのプラクティス テストダブルの活用方法 抽象データ型との繋がり
テスト文化とその意義 テストを 開発プロセスの中心に据えた自動テスト文化 がもたらすメリット デバッグの減少 変更への信頼の増大 ドキュメンテーションの改善 レビューワーの負荷軽減 良い設計につながる 高速で高品質なリリース
開発プロセスの中心の据えた自動テスト文化 を成り立たせる重要な要素 エンジニアが日常的にテストを回す仕組み 破綻したテストをすぐに修正する文化
テストの分類と設計方針
曖昧さをなくすテストの分類方法 「ユニットテスト」とはどんなテストを指すのか、解釈に幅がある。 → 規模 (実行に要するリソース) で小・中・大、範囲 (検証している特定のコードパス) でユニット・インテグレーション・E2Eに分類可能 この規模の分類と範囲の分類を掛け合わせることで 3×3
のマトリクスが得られる。 小テスト 中テスト 大テスト 小範囲 中範囲 大範囲 これでテストの分類に関する曖昧さを減らした議論が可能に
理想のテストピラミッド Google では、 ”エンジニアリング生産性” と “製品の信頼性“ の観点から、テストスイート の設計において以下の指針がある 引用: Google
ソフトウェアエンジニアリング
ユニットテスト中心の構成がもたらすメリット 1テスト当たりの実行時間が短く、フィードバックサイクルが高速 素早くかけるため、テストカバレッジが高水準になりやすい 各テストの内容・目的が単純で、失敗した際に間違っていた理由を理解しやすい
保守性の高いユニットテストを書くためのプラクティス 保守性の高いユニットテストをかけなかった場合、エンジニアの生産性が低下してし まう。 この保守性の高いユニットテストを書くために重要なポイント 脆いテストを防ぐ 明確なテストを書く DAMP なテストコードを目指す
脆いテストを防ぐ 脆いテストとは 実際のバグを全く持ち込んでいない無害かつ無関係な変更に反応して壊れるテスト 理想のテストとは テスト対象システムの要件が変化しない限り、書かれた後は二度と変更が必要ないテ スト この理想のテストを書くためのプラクティスは 公開 API に対するテストを書く
ことと ステートテストを書く こと。
公開 API に対するテストを書く 公開 API に対するテストを書くとは、つまり テスト対象システムのユーザーが呼び出 すのと同じ方法でシステムを呼び出すテストを書く こと。 適切な
公開 API を定義することが重要だが、明確な観点があるわけではなさそう。 (書籍には、経験に基づくユニットに適切な範囲を定義し、それにより公開 API とみな されるべきもの定義する方法が紹介されていた)
ステートテストを書く テスト対象システムが期待通りの挙動を行うか検証する2つの方法 ステートテスト システムのメソッドを呼び出した後に結果が何 (what) であるかを見る インタラクションテスト どのように (how) システムがその結果に到達しかたをチェックする
通常、how をチェックするためにシステムの内部的な実装の詳細に依存するインタラ クションテストは脆くなりがち。
明確なテストを書く 明確なテストとは、その存在目的と失敗理由が、失敗の原因を究明するエンジニアか ら見て明確となるテスト 明確なテストを書くプラクティスは以下の通り テストは完全かつ簡潔にする テストの本体部分に、重要でない情報や紛らわしい情報は全く含まずに、テ ストを理解するのに必要な情報を全部含むテスト メソッドではなく、挙動をテストする テストにロジックを入れない 明確な失敗メッセージを書く
DAMP なテストコードを目指す DAMP (Descriptive And Meaningful Phrases) とは、説明的かつ意味がわかりやすい言い 回しがされていること。 少々の重複は、それがテストを単純かつ明確なものにする限り問題ない。
逆に、共有する価値があるコードは以下の通り 共有値 初期設定の共有 ヘルパーメソッドと検証メソッドの共有 テストインフラストラクチャーを定義 例: JUnits
テストダブルの活用方法 テストダブルのメリット コードの複雑性が増した際にユニットテストを書きやすくする 本物の実装よりも軽量なため、迅速に実行可能な小テストを書きやすくなる テストダブルのデメリット テストダブルを利用するには、コードベースがテスト可能なように設計されている 必要があり、設計コストがかかる (テスト可能性) テストダブルを不適切に使用すると、テストが脆く、複雑になる可能性がある (応
用性) テストダブルの挙動を本物の実装とかなり似せておかないと、実際にテストした い内容が観れるとは限らない (忠実性)
テストダブルの種類と特徴 フェイキング 本物の実装より高速な、本物の実装同様に振る舞うシステム 本物と同じAPI契約を守ることが必須 スタビング 特定の戻り値や例外を返すだけの実装 複雑なシナリオやエラーケースを手軽に再現できる 多用すると、テストが不明確になる & 脆くなる
モック 関数がどのように呼ばれるかを、その関数の実装を実際に呼び出すことなく 検証する方法 内部実装の詳細に依存しがちで、最も脆くなりやすい
本物の依存かテストダブルを使うかの判断基準 観点 実行時間 本物が遅くてフィードバックが阻害される場合はテストダブルを検討 決定性 外部サービスへの依存でたびたび失敗するならテストダブルに置換 依存関係の複雑さ 本物を組み込むために膨大なセットアップが必要ならフェイク優先 方針 まず本物の依存を使い、遅い・不安定になったらフェイク→スタブ→モックと段階的
に導入
抽象データ型との繋がり 以前の関ジャバで 抽象データ型 に関してお話しさせていただいた。 この考え方に則ってテスト対象を設計することで、良いテストが書きやすくなると感 じた。
抽象データ型に基づいた公開 API を用いることで、脆いテストが書きづらくなる 公開 API に依存することが必ず実装の詳細に依存しないとは限らない 抽象データ型に基づいてクラスを設計することで、公開 API が実装の詳細を 外部に露出しなくなり、脆いテストが書きづらくなる
検査すべき挙動 = 公理と捉えることができて、ユニットテストで何を担保するべ きかが明確になる メソッドではなく挙動をテストするべし、の挙動が公理から見えてくる 契約が明確になることでフェイクで何を実装するべきかがわかりやすくなる 事前条件・事後条件を記述するため
まとめ 1. 自動テストを大事にする文化がエンジニアの生産性を向上させる 2. 良い自動テストを書くための指針を理解する 3. 良いテストを書くためには、良い設計が必要
参考文献 Google ソフトウェアエンジニアリング(11–13章) オブジェクト指向入門 第2版 原則・コンセプト