Playwright Load Testing

長年、負荷テストとは API を叩きまくることを意味していました。JMeter のようなツールは、スループットとレイテンシを測るために数千もの軽量な HTTP リクエストを送信していました。そしてそれは機能していました—アプリケーションが単純なリクエスト/レスポンスの仕組みであることをやめるまでは。

現代のウェブアプリは、JavaScript フレームワーク、API、サードパーティ資源によってつなぎ合わされた動的なフロントエンドです。性能はもはやサーバーの応答がどれだけ速いかだけではなく、実ユーザーにとってページがどれだけ速く「感じられるか」が重要です。

そこで Playwright が状況を一変させます。Chromium、Firefox、WebKit といった実際のブラウザーを起動し、まさにユーザーが操作するのと同じように駆動します。ログイン、クリック、スクロールができ、ユーザーが何をいつ見たのかを捕捉できます。そのリアリズムが負荷テストに新たな次元をもたらします。もはやインフラだけでなく—「体験」をテストできるのです。

本記事では、負荷テストにおける Playwright の特長、どのような場面でどのように使うべきか、そして Playwright を用いた負荷テストのベストプラクティスを解説します。

Playwright が負荷テストで異なる点

本質的に、Playwright は Microsoft がエンドツーエンドテスト向けに構築したブラウザー自動化フレームワークです。しかし性能検証に用いると、挙動の確認をはるかに超えます—実ユーザーのセッションとまったく同じ条件を再現し、フロントエンドが実負荷下でどう振る舞うかを明らかにします。

従来の負荷テストツールはサーバーにしか触れません。彼らが測るのは次のような一般的なバックエンド指標です:

  • 応答時間– サーバーがリクエストに応答を返すまでの時間
  • エラー率– 負荷下で失敗または無効な応答の割合
  • スループット– システムが 1 秒あたりに処理できるリクエスト数

これらの数値は有益ですが、ネットワークの端で止まります。ブラウザーがページをレンダリングし、スクリプトを実行し、画面にピクセルを描くまでにどれだけ時間がかかるかは教えてくれません。ここで Playwright が際立ちます。

Playwright はユーザーが実際に体験するものを測定します:

  • First Contentful Paint (FCP) – 最初の可視要素が現れる時点
  • Largest Contentful Paint (LCP) – 主要コンテンツの描画が完了する時点
  • Time to Interactive (TTI) – ページが入力に反応可能になる時点
  • Cumulative Layout Shift (CLS) – ロード中にレイアウトがどれだけ安定しているか

これらの指標は、サーバーの健全性と知覚上の性能とのギャップを埋めます。バックエンドが稲妻のように速くても、ブラウザー側ではレンダリングが重い JavaScript やサードパーティスクリプトにより手待ちになることがあります。Playwright は、DNS や TCP のネゴシエーションから DOM 構築、視覚的安定性に至るまで、すべての層のタイミングを測ることでそのミスマッチを露わにします。

内部的には、各 Playwright テストは実ブラウザーのインスタンスを起動します。つまり、実ユーザーセッションと同様に、完全な JavaScript 実行、CSS レンダリング、GPU コンポジットが行われます。結果として、プロトコルツールでは到達できない精度が得られます—しかし代償もあります。各 Playwright セッションは、単純な HTTP クライアントよりも多くの CPU、メモリ、帯域を消費します。スケーラビリティを犠牲にしたリアリズムであり、だからこそ Playwright は深い洞察のために使うのであって、ユーザー数の純粋な増量には向かないのです。

Playwright を負荷テストに使うべきとき

Playwright は既存の負荷テストツールを置き換えるためのものではありません—補完するためのものです。従来の負荷テストは、ボリューム下でバックエンドがどう動くかを教えてくれます。Playwright は、実ブラウザーの視点でユーザーが同じ負荷をどう体験するかを教えてくれます。併用すれば、性能の全体像の両側面が得られます。

Playwright を使うべき場合:

  • アプリがフロントエンド中心である。 React、Vue、Angular、あるいは WebAssembly のようなフレームワークは、ブラウザー内でのレンダリングとスクリプト実行に多くの時間を費やします。バックエンド指標は良好に見えても、肥大化したバンドルやブロッキングスクリプトのせいでユーザーは待たされることがあります。
  • 認証、ナビゲーション、レンダリングを負荷下で検証したい。 Playwright はログイン、フォーム送信、チェックアウトといったフルフローを実行し、その過程のレンダリング挙動を捕捉できます。
  • テスト結果に Core Web Vitals(FCP、LCP、CLS)が必要。 ブラウザーに基づくテストなら、知覚速度と安定性を規定するこれらの指標を直接把握できます。
  • バックエンド指標は良いのに体感が遅いと感じる。 Playwright は、スクリプト実行、レイアウトシフト、クライアント側 API 呼び出しなど、時間が失われている本当の箇所を明らかにします。

Playwright を避けるべき場合:

  • インフラやスケーリング限界のストレステストが目的。 素の同時実行やスループットには、プロトコルレベルのツールのほうが軽量で効率的です。
  • 何千もの同時仮想ユーザーが必要。 各 Playwright インスタンスは実ブラウザーを走らせるため、巨大なユーザー数へのスケールは資源面で急速に非現実的になります。
  • API のレイテンシやスループットだけが関心事。 バックエンドのみの検証では、Playwright の付加価値はありません。

2 つの補完的なツールだと考えてください。プロトコルレベルの負荷テストは、システムがどれだけ速く応答できるかを測ります。Playwright の負荷テストは、システムがどれだけ速く感じられるかを測ります。両者を合わせれば、サーバー指標からユーザー体験指標へと性能評価の軸を転換できます。

Playwright 負荷テストを効果的に実行する方法

大規模に Playwright を運用するにはバランス感覚が必要です。実ブラウザーは精度をもたらしますが、資源消費も大きいのです。1 万個の Chrome インスタンスを走らせる必要はありませんし、そもそもできません。鍵は、バックエンドのボリュームとフロントエンドのリアリズムを組み合わせるハイブリッド戦略を設計し、従来の負荷テストの広がりと、実ユーザー体験の深みを両立させることです。

1. まずはプロトコルレベルの負荷から始める

JMeter や LoadView の API テストのような軽量なプロトコル系ツールで高ボリュームのトラフィックを模擬します。これらの仮想ユーザーは、アプリのエンドポイント、データベース、キャッシュ層に直接負荷をかけます。目的は、ブラウザーのオーバーヘッドなしに実世界の同時実行やトランザクション率を再現することです。この段階では、スケーリング、データベース競合、CDN 性能といったボトルネックが、ブラウザーテストではレンダリング遅延に隠れてしまうものも含めて浮かび上がります。

2. ブラウザー基盤のセッションを重ねる

バックエンドに圧力がかかったら、Playwright 駆動のブラウザーを少数プールで導入します—通常は 50〜200 の同時セッション。これらのユーザーは、ログイン、ページ遷移、検索・購入・送信といった主要アクションまで、完全なワークフローを実行します。Playwright は実ブラウザーを動かすため、Core Web Vitals(FCP、LCP、CLS)や実負荷下でのサイト挙動を示す性能イベントを捕捉します。サーバーの応答と、その応答が描画体験にどう転化するかの両方が見えます。

3. バックエンドとフロントエンドの指標を相関させる

真の洞察は、バックエンド性能とフロントエンドの体感を突き合わせたときに得られます。サーバー視点では「速い」ページが、ブロッキングスクリプトや長時間走るクライアントコードのせいで遅くレンダリングされることは珍しくありません。Playwright の組み込みトレーシングとパフォーマンス API により、ネットワークのウォーターフォール、CPU 活動、DOM イベントといった詳細なタイミングデータを収集し、バックエンドのログや APM データと突合できます。この相関は、システムが追いついているかどうかだけでなく、負荷増加時にもユーザー体験が安定しているかを示します。

4. 継続的な検証に組み込む

成熟したチームでは、Playwright は単発テストを超えて継続的検証へ拡張できます。軽量なブラウザーシナリオを CI/CD パイプラインに組み込み、リリース前にレンダリングやインタラクティビティのリグレッションを捕捉します。主要なデプロイの節目には(バックエンド+Playwright)の混在テストをスケジュールし、新ビルドが知覚速度を劣化させていないかを確認します。時間の経過とともに、インフラとユーザー体験の両方をカバーする性能ベースラインが構築されます。

5. 可視化し、結果を行動に移す

文脈のないデータは単なるノイズです。Playwright とバックエンドの指標を統合ダッシュボードに集約し、各層の相互作用をチームが把握できるようにします。レイテンシのスパイク、レイアウトシフト、長い TTI は、コード変更や新規依存関係に直結していることが多いものです。可視化はそのループをすばやく閉じ、問題が小さいうちに修正する助けになります。

結論として、Playwright は負荷テストの代替ではなく、拡張であるべきです。プロトコル系ツールは、システムがどれだけ速く応答できるかを測ります。Playwright は、それが実ユーザーにどれだけ速く感じられるかを測ります。両者を併用することで、機械の効率と人間の知覚の両方を反映する「運用上の真実」を得られます。

LoadView と組み合わせた Playwright:ブラウザー基盤テストのスケール

実ブラウザーを大規模に走らせるのは高コストで運用も複雑です。そこで LoadView のようなマネージドプラットフォームがギャップを埋めます。

LoadView は分散環境でブラウザーレベルのスクリプトを実行できます—地理的に多様で、分離され、完全に計測可能です。Playwright のリアリズムと LoadView のスケーラビリティを組み合わせることで、両者の長所を得られます:

  • スクリプト化されたフローを実行する本物の Chrome インスタンス。
  • 複数地域からの分散負荷。
  • 詳細な UX 指標とウォーターフォールの内訳。
  • ローカルインフラ不要の簡素化されたオーケストレーション。

例:ある EC チームは、50 の Playwright ブラウザーで商品のカート追加、割引適用、チェックアウト完了までを実行しつつ、別の 2,000 のプロトコルレベルユーザーが同じ API を叩くテストを行うかもしれません。結果として、システムがどれほど速いかだけでなく、忙しい状況でもどれほど使いやすいかが示されます。

Playwright 負荷テストの制約とベストプラクティス

Playwright のリアリズムは強力ですが、限界も伴います。各テストはフルブラウザー—CPU、メモリ、レンダリング、JavaScript 実行、GPU コンポジット—を起動します。純粋な負荷発生器として扱えば、資源を急速に消費し結果を歪めます。重要なのは、オーバーヘッドを上回る洞察が得られる箇所で、意図的に Playwright を使うことです。

同時実行を抑える

Playwright のブラウザーは軽量な仮想ユーザーではなく、完全な実行環境です。何百・何千も同時に立ち上げる必要はほとんどありません。多くのケースでは、50〜100 の同時セッションで、負荷下のユーザー体験の代表的な姿が得られます。目的はサーバーを飽和させることではなく、トラフィック増加時のレンダリング、スクリプト、インタラクティビティの挙動を観察することです。

スクリプトをモジュール化する

複雑なテストフローは脆く遅くなります。主要なジャーニーやワークフローごとに 1 本のモジュール化されたスクリプトにすれば、より速く実行でき、保守も容易で、リグレッションの切り分けも明確です。例えば、ログイン、ダッシュボード読み込み、チェックアウトは別々のシナリオにします。これにより、どの段階で遅くなるかを特定しやすく、UI の進化に合わせた保守も簡単になります。

両方の視点を追跡する

Playwright だけでは、ユーザーが「何を見たか」は分かっても、なぜ遅いのかは説明できません。常にブラウザー指標を、APM や API 負荷テストから得たバックエンドのテレメトリーと組み合わせましょう。LCP や TTI を API レイテンシやデータベース応答時間と相関させることで、主観的な UX の時間が、実装可能なエンジニアリングデータに変わります。人の遅さの知覚を、システムレベルの原因に結び付けられます。

フロントエンドのボトルネックを切り分ける

レンダリング遅延は、JavaScript 実行、レイアウトのスラッシング、過大なバンドルに起因することが多いです。Playwright は DevTools と直接統合され、パフォーマンストレースや CPU プロファイルを記録できます。これらを使って、レンダリング時間を膨らませるブロッキングスクリプトや不要なレイアウト再計算を特定しましょう。クライアント側の非効率を最適化することは、サーバーチューニング以上に体感速度を改善する場合があります。

CI/CD では控えめに使う

Playwright の最大の強みはリアリズムですが—それは高コストです。継続的インテグレーションでは、主要フローを検証する軽量なスモークテストにブラウザー実行を限定しましょう。より深い多段の UX テストは、パイプラインを遅らせないよう、プリリリースやナイトリービルドに回します。このアプローチなら、実用的な継続監視を保ちつつ、本番前にリグレッションを検出できます。

Playwright はレンズであって、ハンマーではありません。ユーザーが実際に体験していることを拡大し、他のツールが見逃す性能の側面を明らかにします—ただし思慮深く使われた場合に限ります。量ではなく精度に焦点を当てれば、Playwright は性能テストの最も価値ある道具のひとつになります。

結論

Playwright は「負荷テスト」の意味を再定義します。実ユーザーがいる場所—ブラウザー—を再び評価の対象に戻します。ユーザーが見るものを見て、感じるものを測り、実世界の条件下でアプリケーションがどう動くかを理解できます。

これは従来の負荷テストの代替ではありません。機能検証とスケーラビリティのベンチマークの間にある、欠けていたレイヤーです。

Playwright を LoadView の分散ブラウザー基盤と組み合わせることで、チームは大規模でも本物のユーザーセッションをシミュレートし、フロントエンドとバックエンドの性能を相関させ、両者—システムと体験—がその負荷に耐えられるという自信を持って出荷できます。