分離
概要
Playwright で記述されたテストは、ブラウザコンテキストと呼ばれる隔離されたクリーンな環境で実行されます。この分離モデルは、再現性を向上させ、連鎖的なテスト失敗を防ぎます。
テスト分離とは?
テスト分離とは、各テストが他のテストから完全に隔離されている状態を指します。すべてのテストは、他のテストから独立して実行されます。これは、各テストが独自のローカルストレージ、セッションストレージ、Cookie などを持つことを意味します。Playwright は、BrowserContext(インコグニートのようなプロファイルに相当)を使用してこれを実現します。BrowserContext は高速かつ安価に作成でき、単一のブラウザで実行されている場合でも完全に隔離されています。Playwright はテストごとにコンテキストを作成し、そのコンテキスト内でデフォルトの Page を提供します。
なぜテスト分離が重要なのか?
- 失敗の持ち越しがない。あるテストが失敗しても、他のテストには影響しません。
- エラーや不安定さのデバッグが容易。なぜなら、単一のテストを何度でも実行できるからです。
- 並列実行、シャーディングなどの際に、順序を考慮する必要はありません。
テスト分離の 2 つの方法
テスト分離には、スクラッチから開始する方法と、テスト間にクリーンアップする方法の 2 つの異なる戦略があります。テスト間のクリーンアップの問題点は、クリーンアップを忘れてしまうことが容易であり、「訪問済みリンク」など、クリーンアップが不可能なものがあることです。あるテストからの状態が次のテストにリークし、テストが失敗する可能性があり、問題が別のテストから発生するため、デバッグが困難になります。スクラッチから開始するということは、すべてが新しいということです。したがって、テストが失敗した場合、デバッグするためにそのテスト内だけを見ればよいのです。
Playwright がテスト分離を実現する方法
Playwright は、ブラウザコンテキストを使用してテスト分離を実現します。各テストには独自のブラウザコンテキストがあります。テストを実行すると、毎回新しいブラウザコンテキストが作成されます。Playwright をテストランナーとして使用する場合、ブラウザコンテキストはデフォルトで作成されます。それ以外の場合は、ブラウザコンテキストを手動で作成できます。
- Sync
- Async
browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()
browser = await playwright.chromium.launch()
context = await browser.new_context()
page = await context.new_page()
ブラウザコンテキストは、モバイルデバイス、パーミッション、ロケール、カラースキームを含むマルチページシナリオをエミュレートするためにも使用できます。詳細については、エミュレーションガイドをご覧ください。
単一テストでの複数コンテキスト
Playwright は、単一のシナリオ内で複数のブラウザコンテキストを作成できます。これは、チャットのようなマルチユーザー機能をテストしたい場合に便利です。
- Sync
- Async
from playwright.sync_api import sync_playwright, Playwright
def run(playwright: Playwright):
# create a chromium browser instance
chromium = playwright.chromium
browser = chromium.launch()
# create two isolated browser contexts
user_context = browser.new_context()
admin_context = browser.new_context()
# create pages and interact with contexts independently
with sync_playwright() as playwright:
run(playwright)
import asyncio
from playwright.async_api import async_playwright, Playwright
async def run(playwright: Playwright):
# create a chromium browser instance
chromium = playwright.chromium
browser = await chromium.launch()
# create two isolated browser contexts
user_context = await browser.new_context()
admin_context = await browser.new_context()
# create pages and interact with contexts independently
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())