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
02
December 12, 2020
Programming
0
1.2k
テストピラミッドを意識したテストコード実装戦略
このスライドは、「PHP カンファレンス Japan 2020」で登壇した時に使用したスライドです。
02
December 12, 2020
Tweet
Share
More Decks by 02
See All by 02
PHP RFC: Deprecate implicitly nullable parameter types をサクッと話す
cocoeyes02
0
270
PHPUnit 11 概論
cocoeyes02
4
1.5k
Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\Randomizer class solves familiar trouble
cocoeyes02
1
820
BASEにおける インシデント対応フローと工夫
cocoeyes02
0
1k
AWS Lambdaから始める Devチームの小さなDevOps改善 〜QCDどれも諦めない運用を目指して〜 / Start to improving small DevOps with AWS Lambda by Dev Team
cocoeyes02
0
1.3k
PHPUnit 10 概論 / Introduction of PHPUnit 10
cocoeyes02
3
8.5k
テスト駆動開発本をPHPで写経してみた / Copy Test Driven Development Code by PHP
cocoeyes02
0
460
テストコードリーディングのみでPHPUnitの仕様を理解してみる / Try to understand PHPUnit specification with test code reading only
cocoeyes02
1
2.7k
カンファレンススピーカー入門〜登壇するぞ!って決めてからトークするまで〜 / How to talk in Tech Conference
cocoeyes02
2
1.3k
Other Decks in Programming
See All in Programming
Azure AI Foundryのご紹介
qt_luigi
1
210
いりゃあせ、PHPカンファレンス名古屋2025 / Welcome to PHP Conference Nagoya 2025
ttskch
1
180
선언형 UI에서의 상태관리
l2hyunwoo
0
270
はてなにおけるfujiwara-wareの活用やecspressoのCI/CD構成 / Fujiwara Tech Conference 2025
cohalz
3
2.8k
20241217 競争力強化とビジネス価値創出への挑戦:モノタロウのシステムモダナイズ、開発組織の進化と今後の展望
monotaro
PRO
0
290
Rubyでつくるパケットキャプチャツール
ydah
0
170
オニオンアーキテクチャを使って、 Unityと.NETでコードを共有する
soi013
0
370
PSR-15 はあなたのための ものではない? - phpcon2024
myamagishi
0
410
各クラウドサービスにおける.NETの対応と見解
ymd65536
0
250
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
300
functionalなアプローチで動的要素を排除する
ryopeko
1
210
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
1k
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
GraphQLとの向き合い方2022年版
quramy
44
13k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
30
2.1k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
A Tale of Four Properties
chriscoyier
157
23k
Docker and Python
trallard
43
3.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.6k
Optimising Largest Contentful Paint
csswizardry
33
3k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Transcript
テストピラミッドを意識したテスト コード実装戦略 PHP Conference Japan 2020 Track4-3-B #track4-3-b-test-pyramid 02
Who’s 02? 名前: 02 (大津和槻) Twitter: @cocoeyes02 職業: Webエンジニア(主にバックエンド) 経歴:
PHPカンファレンス2019 登壇 「PHPerのためのテストコード入門」
今回の登壇で話すこと • テストピラミッドについて解説 • テストピラミッドを意識しながら、実際にLaravelとPHPをバージョンアップした事例 共有
今回の登壇で話さない(話せない)こと • どのプロダクトにも適応できるテストコード実装戦略
今回のゴール テストコード実装戦略実例を通して、 テストピラミッドについて 理解が深められること
アジェンダ • テストピラミッドとは? • 各層のテストの紹介 • 実例:Laravelチュートリアルのバージョンアップ
テストピラミッドとは?
ユニットテスト 統合テスト テストピラミッドと は? Mike Cohn氏が ”Succeeding with Agile”で 最初に提唱した
3つのテストのコストと実装 すべきテスト量を 示したも の UI テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多
ユニットテスト 統合テスト テストピラミッドと は? コスト • 実行時間 • テスト範囲 •
修正工数 ◦ メンテナンス ◦ テスト失敗時の原 因特定 UI テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多
ユニットテスト 統合テスト テストピラミッドと は? 実装すべきテスト量 • テストのケース量 ◦ 正常系・異常系 ◦
パターン テスト結果(成功/失敗)が わかるまでかかる時間 ≒実行時間×テストケース量 UI テスト 実 装 す べ き テ ス ト 量 小 多 コ ス ト 大 小
フィードバックループ フィードバックを得るまでにかかる時間 を図示したもの 「テスト結果(成功/失敗)がわかるまで かかる時間」がそのまま「フィードバック を得るまでにかかる時間」になる wikipedia "Extreme programming"https://en.wikipedia.org/wiki/Extreme_programming
フィードバックループ フィードバックを得るまでにかかる時間 を図示したもの 「テスト結果(成功/失敗)がわかるまで かかる時間」がそのまま「フィードバック を得るまでにかかる時間」になる →コストが少ないテストの方が、 生産 性↑に繋がりやすい wikipedia "Extreme
programming"https://en.wikipedia.org/wiki/Extreme_programming
各層のテストの紹介
ユニットテスト 統合テスト 各層のテストの紹介 • UIテスト • 統合テスト • ユニットテスト UI
テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多
ユニットテスト 統合テスト UIテスト 最もユーザ目線に近い。 Webサービスではブラウザ を自動操作し、 期待通 りの動作をしているか検証 する Seleniumなどを利用した E2Eテストがこれに当たる。
UI テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多
ユニットテスト 統合テスト 統合テスト 特定のインプットを渡し 返ってきた内容が 正し いかどうかを検証 Featureテスト(Laravelの httpテスト)や、WebAPIを 使ったテストはこれに当た る
UI テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多
ユニットテスト 統合テスト 統合テスト 特定のインプットを渡し 返ってきた内容が 正し いかどうかを検証 Featureテスト(Laravelの httpテスト)や、WebAPIを 使ったテストはこれに当た る
UI テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多 値、リクエス トなど
ユニットテスト 統合テスト ユニットテスト 一つの関数やメソッドに対 して、I/Oを通して 仕様通 りの挙動をしているか検証 する PHPでは、PHPUnitを使う 例が多い UI
テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多
実例題材 LaravelチュートリアルのバージョンUP
Laravel Tutorial
Laravel Tutorial • 超シンプルなTODOリストサービス ◦ 新規登録 ◦ ログイン ◦ ログアウト
◦ パスワードリセット ◦ タスク追加 ◦ タスク削除 • Laravel 5.2 / PHP5.6 • 典型的なMVC
ユニットテスト 統合テスト Laravel Tutorial 実装されているテストコードは featureテスト(統合テスト)のみ • TOP画面が開ける • 新規登録できる
• タスク作成/削除ができる • 他人のタスクは見れない • 他人のタスクの削除はできない UI テスト
ユニットテスト 統合テスト Laravel Tutorial PHPUnitを使っている(v4.8.36!) • 実行時間は2秒ほど UI テスト
Laravel Tutorial • 「本番でバグが出ていることに気づかなかった」という状況を回避しつつ、「Laravel Tutorial」をバージョンアップしたい • バージョンアップ時にエラーが発生する場合は、いち早く気づけるようにしたい
テストピラミッドに合わせた方針候補 • 保険としてUIテストを追加する • 一部設計を修正してから、ユニットテストを追加する
保険としてのUIテストを追加する • ユーザー目線からのテスト(UIを含めてのテスト)も書いて、さらに担保している感を 強めたい ◦ FWのバージョンアップは、どこにバグが現れるかわからない ◦ テストコードというのは、自分が書いたコードに自信を持つことも目的の 1つ •
「全てUIテストで書く」ことはしない ◦ 一番ユーザー目線に近いテストなので安心度があるが、全部 UIで書くとテスト時間が長くなる ▪ 数十分、数時間かかるテストは運用するの辛い ▪ 統合テストよりは少なくする ユニットテスト 統合テスト UI テスト
保険としてのUIテストを追加する • 今回はseleniumを採用 ◦ Laravel DuskはLarvael5.4からなので、今回は使えない ◦ ChromeやFirefoxなどクロスブラウザでのテストができる余地を残しておく • 新規登録→ログアウト→ログイン→タスク登録のUIテストを作成した
◦ 実行時間は30秒 ユニットテスト 統合テスト UI テスト
一部設計を修正してからユニットテストを追加する • 統合テストでカバーできていないテストは、ユニットテストで担保したい ◦ バリデーション ◦ モデル • 一部リファクタリングをして、DBの処理などをモック化できるようにする ユニットテスト
統合テスト UI テスト
一部設計を修正してからユニットテストを追加する • 自分のタスクを一覧表示する機能をリファクタリング ◦ 一覧表示するときの条件をクエリで決めるのではなく、 Collectionのメソッドを使って決めるようにし た ◦ ユニットテスト時には、「 Collectionのメソッドを使って決めた」部分だけテストすれば良い
ユニットテスト 統合テスト UI テスト
一部設計を修正してからユニットテストを追加する • 新規登録時のバリデーションパターンを網羅 • タスク作成時のバリデーションパターンを網羅 • 自分のタスクを一覧表示する機能のロジックをテスト • 実行時間は全部合わせて3.5秒ぐらい ユニットテスト
統合テスト UI テスト
Laravel Tutorial バージョンアップの結果は…? • Laravel 5.2->5.3 ◦ 全層のテストコードでエラーを発見した • Laravel
5.3->5.4 ◦ UIテストのテストコードだけエラーを発見した( viewのキャッシュをクリアするコマンド実行が必要 だった) ◦ あとはテストコードの修正をした • Laravel 5.4->5.5, PHP5.6->7.0 ◦ 全層のテストコードでエラーを発見した • Laravel 5.5->5.6, PHP7.0 -> PHP7.1 ◦ 全層のテストコードでエラーを発見した
Laravel Tutorial バージョンアップの結果は…? • Laravel 5.2->5.3 ◦ 全層のテストコードでエラーを発見した • Laravel
5.3->5.4 ◦ UIテストのテストコードだけエラーを発見した( viewのキャッシュをクリアするコマンド実行が必要 だった) ◦ あとはテストコードの修正をした • Laravel 5.4->5.5, PHP5.6->7.0 ◦ 全層のテストコードでエラーを発見した • Laravel 5.5->5.6, PHP7.0 -> PHP7.1 ◦ 全層のテストコードでエラーを発見した
Laravel Tutorial バージョンアップの結果は…? • Laravel 5.2->5.3 ◦ 全層のテストコードでエラーを発見した • Laravel
5.3->5.4 ◦ UIテストのテストコードだけエラーを発見した( viewのキャッシュをクリアするコマンド実行が必要 だった) ◦ あとはテストコードの修正をした • Laravel 5.4->5.5, PHP5.6->7.0 ◦ 全層のテストコードでエラーを発見した • Laravel 5.5->5.6, PHP7.0 -> PHP7.1 ◦ 全層のテストコードでエラーを発見した
Laravel Tutorial バージョンアップの結果は…? • Laravel 5.2->5.3 ◦ 全層のテストコードでエラーを発見した • Laravel
5.3->5.4 ◦ UIテストのテストコードだけエラーを発見した( viewのキャッシュをクリアするコマンド実行が必要 だった) ◦ あとはテストコードの修正をした • Laravel 5.4->5.5, PHP5.6->7.0 ◦ 全層のテストコードでエラーを発見した • Laravel 5.5->5.6, PHP7.0 -> PHP7.1 ◦ 全層のテストコードでエラーを発見した →いちいち画面を見ることなく、バージョンアップの作業にもくもくできた
最後に • どのテストも銀の弾丸というわけではない ◦ それぞれ長所短所がある • テストどの層でどの範囲を担保するのか、すり合わせることが大事 ◦ 全体を俯瞰して、どの機能がどのテストで担保できているのか見る必要がある
参考文献など • 今回検証に使った環境 ◦ https://github.com/cocoeyes02/laravel_test_pyramid • 参考文献 ◦ 初めての自動テスト ――Webシステムのための自動テスト基礎
◦ https://www.oreilly.co.jp/books/9784873118161/