Playwright Test

Playwright はブラウザ自動化ツールとしてだけでなく、独自の完全なテストフレームワークも備えています —— Playwright Test。

Playwright Test はテストケースの整理、レポート生成、並列実行、失敗時リトライなどを可能にし、機能が充実しており、そのまま使用できます。

  1. Playwright Test は統合されたテストフレームワークです追加の依存関係は不要です。
  2. 設定ファイルでは、タイムアウト、リトライ、レポート、ブラウザプロジェクトなどを設定できます。
  3. テストケースではグループ化、フック、データ駆動がサポートされ、。
  4. 以下並列実行、HTMLレポート、失敗時リトライといった高度な機能を提供します。

テストフレームワーク概要

  • 統合テストフレームワーク: テストランナーを内蔵しており、Jest や Mocha を追加インストールする必要はありません。
  • 組み込みアサーションライブラリ: 対応expectアサーション。
  • テスト分離: 各テストはtestデフォルトで新しいブラウザコンテキストで実行され、互いに干渉しません。
  • 豊富な機能: 並列実行、リトライ、スクリーンショット、録画、HTMLレポートなど。

インストール方法:

npm init playwright@latest

プロジェクト構成を自動生成し、設定ファイルを含みます。playwright.config.js。

1. 設定ファイルの詳細

Playwright Test はplaywright.config.js(または.ts)を設定の入り口として使用します。

// playwright.config.js
import { defineConfig } from '@playwright/test';

export default defineConfig({
  testDir: './tests',         // 测试目录
  timeout: 30 * 1000,         // 单个测试超时时间
  retries: 2,                 // 失败重试次数
  reporter: [['html'], ['list']], // 测试报告类型
  use: {
    headless: true,           // 是否无头模式
    screenshot: 'only-on-failure', // 失败时截图
    video: 'retain-on-failure',    // 失败时保留视频
    baseURL: 'https://example.com', // 基础 URL
  },
  projects: [
    { name: 'Chromium', use: { browserName: 'chromium' } },
    { name: 'Firefox',  use: { browserName: 'firefox' } },
    { name: 'WebKit',   use: { browserName: 'webkit' } },
  ],
});

2. テストスクリプトの構造

Playwright Test スクリプトには通常、以下が含まれます:

1、テストライブラリのインポート

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

2、テストケースの記述

test('示例测试', async ({ page }) => {
  await page.goto('https://example.com');
  await expect(page).toHaveTitle('Example Domain');
});

3、グループ化とフック

  • 使用するdescribeテストを整理する
  • 使用するbeforeEach / afterEach前後処理を行う

テストケースの作成

1. test()関数の使用

test('页面标题验证', async ({ page }) => {
  await page.goto('https://playwright.dev');
  await expect(page).toHaveTitle(/Playwright/);
});

2. describe()グループ化

test.describe('用户登录模块', () => {
  test('输入正确账号密码', async ({ page }) => {
    // 登录逻辑...
  });

  test('输入错误密码', async ({ page }) => {
    // 验证错误提示...
  });
});

3. テストフック

test.describe('购物车模块', () => {
  test.beforeEach(async ({ page }) => {
    await page.goto('https://example.com/cart');
  });

  test.afterEach(async ({ page }) => {
    await page.screenshot({ path: 'cart.png' });
  });

  test('添加商品', async ({ page }) => {
    await page.click('#add-item');
    await expect(page.locator('#cart-count')).toHaveText('1');
  });
});

4. テストデータの準備

パラメータ化テストをサポート:

const users = [
  { name: 'admin', password: '123456' },
  { name: 'guest', password: 'guest' },
];

for (const user of users) {
  test(`用户 ${user.name} 登录`, async ({ page }) => {
    await page.goto('https://example.com/login');
    await page.fill('#username', user.name);
    await page.fill('#password', user.password);
    await page.click('#submit');
    await expect(page.locator('.welcome')).toBeVisible();
  });
}

実行とレポート

1. テスト実行コマンド

npx playwright test          # 运行全部测试
npx playwright test login.spec.js   # 运行单个文件
npx playwright test -g "登录"       # 运行指定用例

2. 並列テスト

Playwright はデフォルトでファイル単位で並列実行します、設定ファイルで workers 数を指定することもできます:

npx playwright test --workers=4

3. テストレポート生成

実行後に生成されるHTMLレポート:

npx playwright show-report

4. 失敗時リトライ機構

設定ファイルplaywright.config.jsで設定します:

retries: 2

テストが失敗した場合に自動的にリトライされ、偶発的なエラーの処理に適しています。

  1. Playwright Test は統合されたテストフレームワークです追加の依存関係は不要です。
  2. 設定ファイルでは、タイムアウト、リトライ、レポート、ブラウザプロジェクトなどを設定できます。
  3. テストケースではグループ化、フック、データ駆動がサポートされ、。
  4. 以下並列実行、HTMLレポート、失敗時リトライといった高度な機能を提供します。

完全なテストスイートの例

1、プロジェクト構成

playwright-demo/
├─ playwright.config.ts           # 全局配置(多项目、多浏览器、报告、重试…)
├─ package.json
├─ tests/
│  ├─ auth.setup.ts               # 一次性登录,生成 storageState
│  ├─ smoke/
│  │  └─ home.spec.ts             # 冒烟用例:标题/URL/截图对比
│  └─ e2e/
│     └─ cart.spec.ts             # 端到端:添加购物车、断言、附件、步骤
├─ fixtures/
│  ├─ pages.ts                    # 页面对象(PO)
│  └─ test.extend.ts              # 自定义 fixtures
└─ snapshots/                     # 视觉基线(自动生成)

2、設定ファイル(playwright.config.ts)

例

// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './tests',
  timeout: 30_000,
  retries: 2,
  workers: 4,
  reporter: [['html', { outputFolder: 'report' }], ['list']],
  forbidOnly: !!process.env.CI,

  // デフォルトで一括使用(プロジェクトまたはテストレベルで上書き可能)
  use: {
    baseURL: 'https://demo.playwright.dev',
    headless: true,
    screenshot: 'only-on-failure',
    video: 'retain-on-failure',
    trace: 'retain-on-failure',
    viewport: { width: 1366, height: 900 },
    locale: 'zh-CN',
  },

  // マルチプロジェクト: 異なるブラウザ/デバイス/ログイン状態
  projects: [
    { name: 'Chromium', use: { ...devices['Desktop Chrome'] } },
    { name: 'Firefox',  use: { ...devices['Desktop Firefox'] } },
    {
      name: 'Mobile Chrome',
      use: { ...devices['Pixel 7'], headless: true },
    },
    // ログイン状態を持つプロジェクト(storageState を再利用)
    {
      name: 'Chromium Logged-in',
      use: { storageState: 'storageState.json' },
      dependencies: ['setup'], // 事前プロジェクトに依存してログイン状態を生成
    },
    // 事前"setup"プロジェクト: 一度だけ実行して storageState を生成
    {
      name: 'setup',
      testMatch: /auth\.setup\.ts/,
    },
  ],
});

ポイント:projects を使用すると、同じテストセットを異なるブラウザ/設定で実行できます。use はグローバル/プロジェクト/テストの3レベルで上書き可能。レポートとリトライは設定で一元的に管理します。

3、フィクスチャとページオブジェクト

fixtures/test.extend.ts(カスタムフィクスチャ + 共通手順のカプセル化)

例

// fixtures/test.extend.ts
import { test as base } from '@playwright/test';
import { HomePage, CartPage } from './pages';

type MyFixtures = {
  home: HomePage;
  cart: CartPage;
};

export const test = base.extend<MyFixtures>({
  home: async ({ page }, use) => {
    const home = new HomePage(page);
    await use(home);
  },
  cart: async ({ page }, use) => {
    const cart = new CartPage(page);
    await use(cart);
  },
});

export { expect } from '@playwright/test';

test.extend() に基づいてカスタムフィクスチャを追加し、任意のテストケースで home や cart のインスタンスを直接注入できるようにします。

fixtures/pages.ts(ページオブジェクト)

例

// fixtures/pages.ts
import { Page, expect } from '@playwright/test';

export class HomePage {
  constructor(private page: Page) {}
  async goto() { await this.page.goto('/'); }
  get tryTodoLink() { return this.page.getByRole('link', { name: /ToDo MVC/i }); }
}

export class CartPage {
  constructor(private page: Page) {}
  async goto() { await this.page.goto('/e2e'); } // e2e サンプルページが存在すると仮定
  get addFirstItem() { return this.page.getByRole('button', { name: /Add .* #1/i }); }
  get cartCount() { return this.page.locator('[data-test=cart-count]'); }
  async addOne() { await this.addFirstItem.click(); }
  async expectCount(n: number) { await expect(this.cartCount).toHaveText(String(n)); }
}

4、事前ログイン(storageState を一度だけ生成)

tests/auth.setup.ts("setup" プロジェクトでのみ実行)

例

// tests/auth.setup.ts
import { test, expect } from '@playwright/test';

test('create storageState', async ({ page }) => {
  await page.goto('https://demo.playwright.dev/todomvc');
  // ……ここをあなたのログインフローに置き換えてください……
  // ログイン成功と仮定
  await expect(page).toHaveURL(/todomvc/);
  await page.context().storageState({ path: 'storageState.json' });
});

5、スモークテスト(タイトル/URL/ビジュアル比較)

tests/smoke/home.spec.ts

例

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

test.describe('Smoke - Home', () => {
  test('title & url & visual snapshot', async ({ page }) => {
    await page.goto('https://playwright.dev');
    await expect(page).toHaveTitle(/Playwright/);
    await expect(page).toHaveURL(/playwright\.dev/);

    // ビジュアルリグレッション(ベースラインを自動生成/比較)
    await expect(page).toHaveScreenshot(); // 初回実行時にベースラインが生成されます
  });
});

ビジュアル比較には toHaveScreenshot の使用を推奨します(page.screenshot() + toMatchSnapshot による手書き方式よりも優先)。

6、E2Eテスト(手順、添付、アサーション)

tests/e2e/cart.spec.ts

例

import { test, expect } from '../../fixtures/test.extend';

test.describe.configure({ mode: 'parallel' });

test.describe('E2E - Cart', () => {
  test.beforeEach(async ({ home }) => {
    await test.step('ホームページに入る', async () => {
      await home.goto();
    });
  });

  test('商品をカートに追加(添付とアサーションを含む)', async ({ page, cart }) => {
    await test.step('カートページに入り商品を追加', async () => {
      await cart.goto();
      await cart.addOne();
      await cart.expectCount(1);
    });

    await test.step('デバッグ情報をレポートに添付', async () => {
      await test.info().attach('state.json', {
        contentType: 'application/json',
        body: Buffer.from(JSON.stringify({ ts: Date.now(), note: 'after add' })),
      });
    });

    // 要素レベルのスクリーンショット
    await test.step('要素スクリーンショット', async () => {
      const badge = page.locator('[data-test=cart-count]');
      await expect(badge).toBeVisible();
      await expect(badge).toHaveScreenshot(); // 要素スナップショット
    });
  });
});

test.step で手順を階層的に記録し、test.info().attach() でデバッグデータ/スクリーンショットをレポートに添付すると調査が容易になります。並列モードは describe.configure({ mode: 'parallel' }) を使用できます。

7、実行とレポート

よく使うコマンド:

npx playwright test                # 运行全部
npx playwright test tests/e2e      # 运行目录
npx playwright test -g "Cart"      # 按标题过滤
npx playwright test --project="Chromium"   # 指定项目
npx playwright show-report         # 打开HTML报告
npx playwright test --update-snapshots     # 更新视觉基线
npx playwright test --debug        # 调试模式(Inspector)

CLI のフィルタリング、プロジェクト選択、レポート表示、スナップショット更新などは、公式の CLI/レポート/スナップショットドキュメントを参照してください。


よく使う関連 API 早見表(Playwright Test)

1、テストとグループ化

API 役割
test(name, fn) テストを定義
test.describe(title, fn) グループ化
test.describe.configure({ mode }) parallel / serial
test.beforeAll/afterAll グループレベルの前後処理
test.beforeEach/afterEach テストケースの前後処理
test.skip/only/fixme/slow/fail テストケースのマーク/制御

2、フィクスチャと設定

API 役割
test.extend<Fixtures>(defs) カスタムフィクスチャを拡張
test.use(options) テストレベルでの上書きuseオプション(例:storageState、viewport、localeなど)
defineConfig({...}) 設定ファイルの入り口(testDir、retries、workers、reporter…)
projects マルチプロジェクト/マルチブラウザ/異なる設定での実行
use: { baseURL, trace, video, screenshot, viewport, locale, timezoneId, storageState } 実行時環境と収集戦略

fixtures / use / 設定項目と projects の詳細は、公式ドキュメント "Fixtures / Use options / Configuration / Projects" を参照してください。(Playwright)

3、アサーション(expect)

API 役割
expect(value).toBe / toEqual / toContain ... 汎用アサーション
expect(locator).toHaveText/Value/Attribute Web 固有アサーション(スマート待機付き)
expect(locator).toBeVisible/Hidden/Enabled/Disabled/Checked 状態アサーション
expect(page).toHaveTitle/URL ページアサーション
`expect(page/locator).toHaveScreenshot([name options])` ビジュアルスナップショット比較(推奨)

アサーションとビジュアルスナップショットの推奨プラクティスは、Assertions と Snapshots のドキュメントを参照してください。(Playwright)

4、手順と添付

API 役割
test.step(name, fn) テストをステップに分割する(レポートの可視化)
`test.info().attach(name, { path body, contentType })` テストまたはステップにファイル/データを添付する(レポートで表示)

添付ファイルはステップレベルにも適用できます(TestStep / TestStepInfo を参照)。(Playwright)

5、レポートとCLI

コマンド/設定 役割
reporter: [['html', { outputFolder }], ['list']] レポート設定
npx playwright test --project="Chromium" プロジェクトを選択して実行
-g "keyword" / --grep / --grep-invert テストケースのフィルタリング
--update-snapshots ビジュアルベースラインの更新
npx playwright show-report レポートを開く

完全なCLIとReporterオプションは公式ドキュメントを参照してください。(Playwright)

その他の拡張