Skip to content
Go back

レガシーコードにE2Eを追加していく戦略と考え方

Published:  at  10:00 PM

これは今の時点での“僕なりのやり方”

まずはじめに断っておくと、ここに書いているのは「今の自分が、現場でやってみてこういう方向にしたらうまくいきそう」と思ったものであって、いつか見直すかもしれないし、誰にでも当てはまる正解ではないです。

なので「ふーんこういう感じでやると進めやすそうなんだな」くらいに思ってもらえればうれしいです。


はじめに

5年以上開発が続くレガシーな業務アプリケーションに、E2Eテスト(End-to-End Test)をPlaywrightで導入し始めた。本記事では、その方針や考え方、試行錯誤、得られた知見を整理する。

単なる作業ログではなく、「どういうトレードオフがあって、なぜそう判断したのか」を残すことで、今後の意思決定や他プロジェクトへの展開時にも役立てたい。


背景

当初は「Vitestだけで十分では?」と考えていた。コンポーネント単位でのテストは状態の切り分けや意図的な制御が容易だからだ。

しかし実際のレガシーコードでは、状態やデータ構造が複雑すぎて「どんなpropsを渡せばよいかすら不明」という場面が多発した。

Next.jsのようにサーバーサイドロジックやハイドレーション後の状態が絡むケースもあり、ユニットテストだけでは網羅が難しい。

そのため、PlaywrightでUIを通じて仕様を確認・動作確認するというアプローチの方が現実的と判断した。


方針の基本設計とトレードオフ

一気に完璧な体制を目指すのではなく、段階的に進められるよう「壊さないこと」「壊れたらすぐ気づけること」を優先。

そこで、CORS回避やUIのデバッグ速度などを考慮し、初期段階ではChromium限定で構築している。他ブラウザ対応やCI統合は後回し。

選択の理由

ステップ別戦略

Step 1: 実環境ベースでの導入

トレードオフ: モックより手軽だが、データ依存やCORS制約あり

test.use({
  bypassCSP: true,
  launchOptions: { args: ['--disable-web-security'] },
  video: 'on',
  screenshot: 'only-on-failure',
})

Step 2: スモークテストを先行

トレードオフ: 完全網羅より、「最低限の動作確認」を優先

Step 3: シナリオベースに設計

トレードオフ: UI単位よりも、ユーザー体験単位で整備

モック戦略とデータの扱い

CORS回避策

CIは後回しに

トレードオフ: 安定しないテストをCIに載せても開発効率を下げるだけ

Feature Flagとの付き合い方

トレードオフ: 条件分岐が多すぎるとテストが壊れやすくなる

守るべきポイントの優先順位

ゴールと期待する効果

期待される具体的なメリット


最後に:完璧じゃなくてもいい

「全部テストしよう」と思うとしんどくなる。

最初は「壊れたら困るところ」だけでいい。

小さく始めて、動いていることを積み重ねていこう。

Playwrightは楽しい。スクショも動画も撮れる。失敗すれば即わかる。

レガシーコードにこそ、E2Eテストは意味がある。


Suggest Changes
Share this post on:

Previous Post
GitButlerとVSCode Remote SSH - リモート開発での課題と解決策
Next Post
MCP + Playwrightを使ってみた: 実際の作業をAIエージェントにやらせてみた感想