Playwright Test
Playwright はブラウザ自動化ツールとしてだけでなく、独自の完全なテストフレームワークも備えています —— Playwright Test。
Playwright Test はテストケースの整理、レポート生成、並列実行、失敗時リトライなどを可能にし、機能が充実しており、そのまま使用できます。
- Playwright Test は統合されたテストフレームワークです追加の依存関係は不要です。
- 設定ファイルでは、タイムアウト、リトライ、レポート、ブラウザプロジェクトなどを設定できます。
- テストケースではグループ化、フック、データ駆動がサポートされ、。
- 以下並列実行、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
テストが失敗した場合に自動的にリトライされ、偶発的なエラーの処理に適しています。
- Playwright Test は統合されたテストフレームワークです追加の依存関係は不要です。
- 設定ファイルでは、タイムアウト、リトライ、レポート、ブラウザプロジェクトなどを設定できます。
- テストケースではグループ化、フック、データ駆動がサポートされ、。
- 以下並列実行、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)
例
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(カスタムフィクスチャ + 共通手順のカプセル化)
例
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(ページオブジェクト)
例
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" プロジェクトでのみ実行)
例
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
例
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
例
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)