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
PHPUnitの限界をPlaywrightで補完するテストアプローチ
Search
yuzneri
July 18, 2025
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPUnitの限界をPlaywrightで補完するテストアプローチ
2025年7月18日
PHPカンファレンス関西2025
yuzneri
July 18, 2025
More Decks by yuzneri
See All by yuzneri
昔つくったIoTデバイス
yuzneri
0
37
サークル参加から学ぶ、小さな事業の回し方
yuzneri
0
280
色を視る
yuzneri
0
480
ゲームと乱数
yuzneri
0
83
即売会で使える業務用決算端末
yuzneri
0
73
コードの外側に惹かれた
yuzneri
0
78
ぼくの開発環境2026
yuzneri
1
420
2025年アウトプット振り返り
yuzneri
0
59
E2Eテストで開発を止めないためのPlaywright高速化
yuzneri
0
400
Other Decks in Programming
See All in Programming
act1-costs.pdf
sumedhbala
0
230
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
950
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
230
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
430
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
3
1.5k
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
510
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
130
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
230
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
390
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
460
Claude Team Plan導入・ガイド
tk3fftk
0
210
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
680
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Bash Introduction
62gerente
615
220k
The Invisible Side of Design
smashingmag
301
52k
Skip the Path - Find Your Career Trail
mkilby
1
170
Writing Fast Ruby
sferik
630
63k
So, you think you're a good person
axbom
PRO
2
2.1k
Into the Great Unknown - MozCon
thekraken
41
2.6k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
600
Automating Front-end Workflow
addyosmani
1370
210k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
How to Talk to Developers About Accessibility
jct
2
400
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
180
Transcript
PHPUnitの限界をPlaywright で補完するテストアプローチ 2025年7⽉18⽇ PHPカンファレンス関⻄2025
ゆずねり@yuzneri 2025/7/18 2 •バックエンド、たまにフロント エンドもさわる⼈ •技術同⼈誌の執筆 •ドール、ポーカー、謎解き 𝕏:@yuzneri
会員登録フォームを作りたい 2025/7/18 3 •会員IDのみのシンプル会員登録 •会員IDにはルールがある •→バリデーションを実装
validateメソッドを実装 public function validate(string $memberId) { $errors = []; if
(!$this->isAlphanumeric($memberId)) { $errors[] = '英数字のみ利用できます。'; } // 省略 return $errors; } 2025/7/18 4
PHPUnit •PHPアプリケーションのテストフレームワーク •PHPで書かれたコードを⾃動テスト •ロジックが正しく動くかどうか 2025/7/18 5
PHPUnitテスト public function testInvalidSpecialCharacters() { $controller = new MemberController(); $this->assertContains(
'英数字のみ利用できます。', $controller->validate('user@123') ); } 2025/7/18 6
画⾯を実装したけどテストは…? 2025/7/18 7
⾃動テストの種類 •ユニットテスト(単体テスト) •インテグレーションテスト(結合テスト) •E2Eテスト(End-to-End テスト) 2025/7/18 8
⾃動テストのテスト観点 • ユニットテスト • 単⼀のメソッド • 副作⽤がない • インテグレーションテスト •
複数のメソッドを統合 • 副作⽤はあっても良い 2025/7/18 9 • E2Eテスト • システム全体をユーザー⽬線
⾃動テストの範囲 2025/7/18 10 アカウント View HTML JS CSS DB アカウント
Model 削除メソッド 登録メソッド ユニットテスト アカウント Controller バリデーション メソッド ユニットテスト インテグレーションテスト E2Eテスト
PHPUnitでE2Eテストはできる? •ブラウザの挙動を再現できない •JavaScriptの動的処理 •デザイン •クッキーやローカルストレージを伴った画⾯遷移 2025/7/18 11
Playwright •マイクロソフト社が開発 •Webサイトのテストフレームワーク •Webブラウザを⾃動操作してテスト 2025/7/18 12
Playwrightの特徴 •Chromium、Firefox、WebKitを⾃動操作 •ユーザ⽬線に近い状態でテストできる •Windows、macOS、Linux、Dockerに対応 •Node.jsが⼊っていればすぐに動かせる •CI/CDで⾃動テストがやりやすい 2025/7/18 13
Playwrightテスト例 test('testInvalidSpecialCharacters', async ({ page }) => { await page.goto('http://localhost:8080');
await page.getByRole('textbox', { name: '会員ID' }) .fill('user@123'); await page.getByRole('button', { name: '登録' }).click(); await expect(page.locator('.error')) .toContainText('英数字のみ利用できます。'); }); 2025/7/18 14
URLを開く page.goto('http://localhost:8080') •ブラウザで指定したURLを開く 2025/7/18 15
要素を探す •タグにはロール(役割)が定義されている •例えば<input type="text">だと「textbox」 •PlaywrightのLocatorでロールを指定して要素 を選択する •UIの意味に基づくので壊れにくい 2025/7/18 16
Locaterでボタンを探す <button type="submit">登録</button> 2025/7/18 17 getByRole('button', { name: '登録' })
Locaterでテキストボックスを探す <label for="member_id">会員ID</label> <input type="text" id="member_id" name="member_id"> 2025/7/18 18 getByRole('textbox',
{ name: '会員ID' })
フォーム⼊⼒したりボタンを押したり page.getByRole(...).fill(id) page.getByRole(...).click() •fill()はフォーム⼊⼒ •click()はクリック 2025/7/18 19
テストする expect(page.locator('.error')) .toContainText('英数字のみ利用できます。') •expect()で要素を指定して •toContainText()で要素を確認する 2025/7/18 20
E2Eテストは時間とコストがかかる •テスト時にブラウザが動いている •同じようなテストケースでも時間がかかる • 6ケース実施すると • PHPUnit: 0.017秒 • Playwright:
2.000秒 (Chromiumのみ) •マシンスペックもある程度必要 2025/7/18 21
テストピラミッド 2025/7/18 22 E2Eテスト インテグレーション テスト ユニットテスト 速度 速い 遅い
コスト ⾼い 低い テストケース
PHPUnitの使い所 •ビジネスロジックとアプリケーションルールの テスト •バリデーションロジックを網羅的にテスト •DBにユーザーレコードが作成される 2025/7/18 23
Playwrightの使い所 •ユーザーのインタラクションと体験のテスト •なにかしらのバリデーションエラーメッセージが 表⽰される •会員登録完了画⾯まで表⽰される •デザインがくずれていない •テストがないコードのリファクタリング補助 2025/7/18 24
まとめ •PHPUnitはバックエンドを検証する礎 •Playwrightはユーザ体験の守護神 •お互いの特徴にあわせて適切に使い分けること で、より安⼼して開発できます 2025/7/18 25