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
920
0
Share
PHPUnitの限界をPlaywrightで補完するテストアプローチ
2025年7月18日
PHPカンファレンス関西2025
yuzneri
July 18, 2025
More Decks by yuzneri
See All by yuzneri
即売会で使える業務用決算端末
yuzneri
0
25
コードの外側に惹かれた
yuzneri
0
43
ぼくの開発環境2026
yuzneri
1
330
2025年アウトプット振り返り
yuzneri
0
35
E2Eテストで開発を止めないためのPlaywright高速化
yuzneri
0
270
努力の方向を変えれば結果は変わる(画像削除済)
yuzneri
2
120
技術同人誌を書いてみよう!
yuzneri
1
83
みんなにやさしいウェブサイト
yuzneri
1
150
Other Decks in Programming
See All in Programming
Radical Imagining - LIFT 2025-2027 Policy Agenda
lift1998
0
250
10年分の技術的負債、完済へ ― Claude Code主導のAI駆動開発でスポーツブルを丸ごとリプレイスした話
takuya_houshima
0
2.3k
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
170
レガシーPHP転生 〜父がドメインエキスパートだったのでDDD+Claude Codeでチート開発します〜
panda_program
0
650
「話せることがない」を乗り越える 〜日常業務から登壇テーマをつくる思考法〜
shoheimitani
4
690
アーキテクチャモダナイゼーションとは何か
nwiizo
17
4.8k
ルールルルルルRubyの中身の予備知識 ── RubyKaigiの前に予習しなイカ?
ydah
0
120
瑠璃の宝石に学ぶ技術の声の聴き方 / 【劇場版】アニメから得た学びを発表会2026 #エンジニアニメ
mazrean
0
230
セグメントとターゲットを意識するプロポーザルの書き方 〜採択の鍵は、誰に刺すかを見極めるマーケティング戦略にある〜
m3m0r7
PRO
0
450
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
6.2k
SkillがSkillを生む:QA観点出しを自動化した
sontixyou
6
3.2k
Linux Kernelの1文字のミスで 権限昇格ができた話
rqda
0
2.3k
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
68
38k
Site-Speed That Sticks
csswizardry
13
1.1k
Optimizing for Happiness
mojombo
378
71k
We Have a Design System, Now What?
morganepeng
55
8.1k
Scaling GitHub
holman
464
140k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
460
Tell your own story through comics
letsgokoyo
1
890
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
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