Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
テストピラミッドを意識したテストコード実装戦略
Search
02
December 12, 2020
Programming
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
テストピラミッドを意識したテストコード実装戦略
このスライドは、「PHP カンファレンス Japan 2020」で登壇した時に使用したスライドです。
02
December 12, 2020
More Decks by 02
See All by 02
なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは 見送りだったか / Why array_value_first and array_value_last was declined, then why array_first and array_last was accpeted?
cocoeyes02
0
610
Amazon ECS Managed Instances が リリースされた!キャッチアップしよう!! / Let's catch up Amazon ECS Managed Instances
cocoeyes02
0
570
新しいPHP拡張モジュールインストール方法「PHP Installer for Extensions (PIE)」を使ってみよう!
cocoeyes02
0
2.2k
PHP8.4におけるJITフレームワークIRと中間表現について理解を深める
cocoeyes02
1
1.4k
RemoveだらけのPHPUnit 12に備えよう
cocoeyes02
0
1.5k
PHP RFC: Deprecate implicitly nullable parameter types をサクッと話す
cocoeyes02
0
1.1k
PHPUnit 11 概論
cocoeyes02
5
4k
Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\Randomizer class solves familiar trouble
cocoeyes02
1
1.5k
BASEにおける インシデント対応フローと工夫
cocoeyes02
0
1.4k
Other Decks in Programming
See All in Programming
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
190
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
180
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
110
Railsバージョンを4倍にした話
optim
0
460
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
1
220
The Rails Doctrine Decade
koic
2
600
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
830
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
140
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
GraphQLとの向き合い方2022年版
quramy
50
15k
Bash Introduction
62gerente
615
220k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
Rails Girls Zürich Keynote
gr2m
96
14k
How to Ace a Technical Interview
jacobian
280
24k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
270
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
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/