第53章:UIテスト戦略(やる/やらないを決める)🧭

🎯この章のゴール
UIテストで迷子にならないために、**「どこまで自動テストするか」**を自分で決められるようになるよ😊✨ テストを増やしすぎず、でも怖くないラインを作るのが目的〜!🛡️💕
1) まず“テストの種類”を4つに分ける(頭の地図)🗺️

UIの世界は、だいたいこの4つで考えるとスッキリするよ👇 (これは Testing Trophy って呼ばれる整理で、現代フロントエンド向けの考え方として有名だよ)(kentcdodds.com)
- 🧱 Static(静的):型チェック・Lintで「やらかし」を早めに止める
- 🧪 Unit(単体):小さいロジックをピンポイントでテスト
- 🧩 Integration(結合):UIや複数部品が“ユーザー操作として”動くか
- 🌐 E2E:ブラウザで本番っぽく最重要導線だけ守る
ここで大事なのは、全部をE2Eにしないこと!😵💫💦 E2Eは強いけどコストも高いから、「ここぞ」だけにするのがコツだよ🙆♀️✨
2) UIテストは「ユーザーが見えるものだけ」を触る🫶
UIテストで壊れやすくなる原因はだいたいコレ👇 “実装の中身”を触りすぎること😇💥
Playwrightの公式ベストプラクティスでも、 **「ユーザーに見える振る舞いをテストして、実装詳細に寄らない」**が強く推されてるよ(playwright.dev)
✅ UIテストで見るべきもの
- 画面に表示される文言・ボタン・入力欄
- クリック/入力した結果の表示変化
- エラーメッセージが出る/出ない
- ページ遷移・保存された/されない
🚫 なるべく触らないもの(壊れやすい😵)
- CSSクラス名
- コンポーネント内部の関数名
- stateの持ち方の細部
- “実装した順番”に依存すること
3) 「UIで何をテストするか」を決める3つの質問🪄
UIテスト対象を選ぶときは、これでOK👇💕
Q1:それ壊れたら“致命的”?😱
- ログインできない
- 購入できない
- データ保存できない → こういうのは最優先🔥
Q2:ユーザーが“よく通る道”?🚶♀️🚶♂️
- 毎日使う検索
- よく押される「追加」「保存」 → 回数が多いほど事故が痛い💥
Q3:そこは“壊れやすい境界”?🔌
- API通信まわり
- 入力バリデーション
- 画面遷移 → 仕様変更や連携変更が入りやすいところ!
この3つで「YES」が多いほど、UIテストで守る価値が高いよ😊✅
4) どの層で守る?“おすすめ振り分け”🧠✨
迷ったらこの感覚でいくと失敗しにくいよ👇
- 🧠 ロジックはUnit/Integrationに寄せる(速い・安定)
- 🖥️ UIはIntegration中心(クリック→表示変化を守る)
- 🌐 E2Eは最重要導線だけ(保険の最後の砦🛡️)
「Integrationを厚めにする」方向性は、Testing Trophyでもよく語られるよ(kentcdodds.com)
5) “壊れにくいUIテスト”のためのルール3つ🧷✨
ルール①:セレクタは「役割」で取る(getByRole)🎯
Playwrightは user-facing な取り方として getByRole() を推してるよ(playwright.dev)
(Testing Libraryでも role 系が基本の考え方として案内されてるよ🫶)(testing-library.com)
例(イメージ)👇
await page.getByRole('button', { name: '保存' }).click()
💡「roleで取れない」= UIのアクセシビリティが弱いサインのことも多いよ🙈
ルール②:UIテストは“独立”させる🧼
Playwrightも「各テストを独立させよう」って明言してるよ(playwright.dev) 前のテストの結果に乗っかった瞬間、たまに落ちる地獄が始まる…😇💥
ルール③:待ち時間(sleep)で殴らない😵💫
UIは非同期が多いから、**「出るまで待つ」**が基本。
Testing Libraryにも findBy... や waitFor など“待つ仕組み”が整理されてるよ(testing-library.com)
6) 2026の“選びやすい道具セット”🧰✨(最新事情)
🧪 UIコンポーネント寄り:Vitest + Browser Mode(選択肢が強い!)
Vitestには Browser Mode があって、ブラウザでネイティブ実行できるよ🖥️✨
しかも vitest init browser でセットアップできたり、providerに playwright を選べる構成になってる!(Vitest)
- CIで回すなら playwright / webdriverio が必要
- そして Playwright推し(並列実行で速い) とVitest側が書いてるよ(Vitest)
さらに、Browser Modeだと「本物のブラウザ上でイベント実行」寄りになるので、モック地獄を減らせる方向性も紹介されてるよ(gihyo.jp)
🌐 E2E:Playwright(重要導線の保険)🛡️
- “ユーザーが見える動き”をテストする哲学が公式で強い(playwright.dev)
- locatorも
getByRole()など 壊れにくい推奨が明確(playwright.dev)
🧪手を動かす:あなたのアプリで「守る導線3つ」を決めよう🎀
今日の作業はコードより 設計メモ が主役だよ😊📝
Step 1:重要導線を3つ書く(例)
- ✅ ログインできる
- ✅ 商品をカートに入れられる
- ✅ 購入確定できる
Step 2:各導線を3段に振り分ける
それぞれについて👇を書くだけ!
- 🧠 Unitで守る部分(例:合計金額計算、割引計算)
- 🧩 Integrationで守る部分(例:クリック→表示変化、エラー表示)
- 🌐 E2Eで守る部分(例:ログイン→購入完了の1本だけ)
Step 3:やらないことリストも書く(超大事!)🚫✨
- 「全画面のスナップショット」全部はやらない
- 「CSSクラス指定のセレクタ」は基本やらない
- 「細かいUIの見た目」は後の章(発展)で必要な時だけ
🤖AIの使い方(この章の鉄板プロンプト)💬✨
コピペで使えるよ〜!😍
- 導線抽出
この機能の「ユーザーの重要導線」を最大5つ挙げて。
それぞれ、壊れた時の致命度(高/中/低)もつけて。
- テスト振り分け
この導線を Unit / Integration / E2E に振り分けたい。
「どこをどの層で守るべきか」を理由つきで提案して。
- 壊れやすさ診断(セレクタ)
UIテストが壊れやすくなるポイントを列挙して。
roleベース(getByRole)に寄せる改善案も出して。
✅チェック(できたら合格〜!)🎉
- ✅ 重要導線が3つ言える
- ✅ 導線ごとに「Unit/Integration/E2E」の役割分担が書けた
- ✅ 「やらないこと」も決めた(←えらい!!🥹✨)
- ✅ UIテストは“ユーザーに見える動き”中心って言える(playwright.dev)
- ✅ セレクタは
getByRole優先の理由が説明できる(playwright.dev)
次の第54章では、ここで決めた方針をもとに DOM/コンポーネントの最小テストを1本ちゃんと書いて、「壊れにくい形」に仕上げるよ🧱🧪✨