メインコンテンツへスキップ

分離

はじめに

Playwrightで記述されたテストは、ブラウザコンテキストと呼ばれる隔離されたクリーンな環境で実行されます。この分離モデルにより、再現性が向上し、連鎖的なテスト失敗を防ぐことができます。

テスト分離とは?

テスト分離とは、各テストが他のテストから完全に隔離されている状態を指します。すべてのテストは、他のテストとは独立して実行されます。これにより、各テストは独自のローカルストレージ、セッションストレージ、Cookieなどを持つことができます。Playwrightは、シークレットモードのようなプロファイルに相当するブラウザコンテキストを使用することでこれを実現します。これらは作成が高速かつ安価であり、単一のブラウザで実行されている場合でも完全に隔離されています。Playwrightは各テスト用にコンテキストを作成し、そのコンテキスト内でデフォルトのページを提供します。

テスト分離が重要な理由

  • 失敗の持ち越しがない。1つのテストが失敗しても、他のテストには影響しません。
  • エラーや不安定さのデバッグが容易。1つのテストを好きなだけ何度でも実行できるため。
  • 並列実行やシャーディングなどを行う際に順序を気にする必要がない。

テスト分離の2つの方法

テスト分離には、「ゼロから開始する」と「途中できれいにする」という2つの異なる戦略があります。テストの途中でクリーンアップすることの問題点は、クリーンアップを忘れがちであること、また「訪問済みリンク」のようにクリーンアップが不可能なものがあることです。あるテストの状態が次のテストに漏れてしまい、テストが失敗したり、問題が別のテストから来ているためデバッグが難しくなったりする可能性があります。ゼロから開始するということは、すべてが新しいということなので、テストが失敗した場合、デバッグはそのテスト内だけを見れば済みます。

Playwrightはどのようにテスト分離を実現するか

Playwrightはブラウザコンテキストを使用してテスト分離を実現します。各テストは独自のブラウザコンテキストを持ちます。テストを実行するたびに、新しいブラウザコンテキストが作成されます。Playwrightをテストランナーとして使用する場合、ブラウザコンテキストはデフォルトで作成されます。そうでない場合は、ブラウザコンテキストを手動で作成できます。

import { test } from '@playwright/test';

test('example test', async ({ page, context }) => {
// "context" is an isolated BrowserContext, created for this specific test.
// "page" belongs to this context.
});

test('another test', async ({ page, context }) => {
// "context" and "page" in this second test are completely
// isolated from the first test.
});

ブラウザコンテキストは、モバイルデバイス、パーミッション、ロケール、配色を含む複数ページシナリオをエミュレートするためにも使用できます。詳細については、エミュレーションガイドをご覧ください。

単一テストにおける複数コンテキスト

Playwrightは、単一のシナリオ内で複数のブラウザコンテキストを作成できます。これは、チャットのような複数ユーザー機能をテストしたい場合に便利です。

import { test } from '@playwright/test';

test('admin and user', async ({ browser }) => {
// Create two isolated browser contexts
const adminContext = await browser.newContext();
const userContext = await browser.newContext();

// Create pages and interact with contexts independently
const adminPage = await adminContext.newPage();
const userPage = await userContext.newPage();
});