分離
はじめに
Playwright で作成されたテストは、ブラウザコンテキストと呼ばれる分離されたクリーンな環境で実行されます。この分離モデルは、再現性を向上させ、テストの失敗が連鎖するのを防ぎます。
テスト分離とは?
テスト分離とは、各テストが他のテストから完全に分離されていることです。すべてのテストは、他のテストから独立して実行されます。これは、各テストが独自のローカルストレージ、セッションストレージ、Cookieなどを持っていることを意味します。Playwright は、BrowserContext(インコグニートのようなプロファイルと同等)を使用してこれを実現します。BrowserContext は、高速かつ安価に作成でき、単一のブラウザで実行されている場合でも完全に分離されています。Playwright は、各テストのコンテキストを作成し、そのコンテキスト内にデフォルトのPageを提供します。
なぜテスト分離が重要なのか?
- 失敗の持ち越しがない。あるテストが失敗しても、他のテストには影響しません。
- エラーや不安定さをデバッグしやすい。なぜなら、単一のテストを好きなだけ実行できるからです。
- 並列処理、シャーディングなどで実行する場合、順序について考える必要はありません。
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.
});
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
ブラウザコンテキストは、モバイルデバイス、権限、ロケール、カラースキームを含むマルチページシナリオをエミュレートするためにも使用できます。詳細については、エミュレーションガイドをご覧ください。
単一テストでの複数コンテキスト
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();
});
const { chromium } = require('playwright');
// Create a Chromium browser instance
const browser = await chromium.launch();
// Create two isolated browser contexts
const userContext = await browser.newContext();
const adminContext = await browser.newContext();
// Create pages and interact with contexts independently
const adminPage = await adminContext.newPage();
const userPage = await userContext.newPage();