Files
awoooi/docs/testing/PLAYWRIGHT_CONFIG.md
OG T 7478dc0254 feat(phase6-9): Complete modular architecture and Agent Teams
Phase 6.4 - Modular Architecture:
- Add lewooogo-brain adapters for LLM providers
- Add lewooogo-data dual memory (Redis + PostgreSQL)
- Implement consensus engine for multi-agent decisions
- Add incident memory service for historical context

Phase 9 - Agent Teams (Claude Agent SDK):
- Add base agent class with Claude Sonnet 4 integration
- Implement action planner, blast radius, and security agents
- Add agent API endpoints and proposal workflow
- Integrate ADR-009 OpenClaw Agent Teams architecture

DevOps & CI/CD:
- Add GitHub Actions CI/CD workflows (ci.yaml, cd.yaml)
- Add pre-commit hooks and secrets baseline
- Add docker-compose for local development
- Update Kubernetes network policies

Frontend Improvements:
- Add auto-healing error boundary component
- Update i18n messages for agent features
- Enhance dual-state incident card with execution feedback

Documentation:
- Add 7 ADRs covering MCP, design system, architecture decisions
- Update ARCHITECTURE_MEMORY.md with modular design
- Add GLOBAL_RULES.md and SOUL.md for project identity

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-23 18:40:36 +08:00

5.2 KiB
Raw Blame History

Playwright E2E 測試配置

版本: v1.0 建立日期: 2026-03-20 負責人: CPO CEO 指示 #5: 啟用截圖與錄影加速除錯


配置檔案

// apps/web/playwright.config.ts

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

export default defineConfig({
  testDir: './e2e',
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 1 : undefined,
  reporter: [
    ['html', { outputFolder: 'playwright-report' }],
    ['json', { outputFile: 'playwright-report/results.json' }],
  ],

  use: {
    baseURL: process.env.BASE_URL || 'http://localhost:3000',
    trace: 'on-first-retry',

    // ⚠️ CEO 指示 #5: 截圖與錄影必須啟用
    screenshot: 'on',           // 每個測試都截圖
    video: 'on-first-retry',    // 失敗時錄影

    // 本地化設定
    locale: 'zh-TW',
    timezoneId: 'Asia/Taipei',
  },

  projects: [
    // Desktop Chrome (主要)
    {
      name: 'chromium',
      use: {
        ...devices['Desktop Chrome'],
        viewport: { width: 1920, height: 1080 },
      },
    },

    // Desktop Firefox
    {
      name: 'firefox',
      use: { ...devices['Desktop Firefox'] },
    },

    // Desktop Safari
    {
      name: 'webkit',
      use: { ...devices['Desktop Safari'] },
    },

    // Mobile Chrome
    {
      name: 'Mobile Chrome',
      use: { ...devices['Pixel 5'] },
    },

    // Mobile Safari
    {
      name: 'Mobile Safari',
      use: { ...devices['iPhone 12'] },
    },
  ],

  // 本地開發伺服器
  webServer: process.env.CI ? undefined : {
    command: 'pnpm dev',
    url: 'http://localhost:3000',
    reuseExistingServer: !process.env.CI,
  },

  // 輸出目錄
  outputDir: 'test-results/',

  // 截圖設定
  expect: {
    toHaveScreenshot: {
      // 允許 1% 像素差異
      maxDiffPixelRatio: 0.01,
    },
  },
});

截圖與錄影配置

截圖模式

模式 說明 建議場景
'off' 不截圖 -
'on' 每個測試都截圖 開發/CI (建議)
'only-on-failure' 失敗時截圖 大規模測試

錄影模式

模式 說明 建議場景
'off' 不錄影 -
'on' 每個測試都錄影 深度除錯
'retain-on-failure' 失敗時保留 CI (建議)
'on-first-retry' 重試時錄影 CI (建議)

視覺回歸測試

基準截圖

// e2e/dashboard.spec.ts

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

test('dashboard renders correctly', async ({ page }) => {
  await page.goto('/dashboard');
  await page.waitForLoadState('networkidle');

  // 全頁截圖比對
  await expect(page).toHaveScreenshot('dashboard-full.png', {
    fullPage: true,
    maxDiffPixelRatio: 0.01,
  });

  // 特定元素截圖
  const hostCard = page.locator('[data-testid="host-card"]').first();
  await expect(hostCard).toHaveScreenshot('host-card.png');
});

基準圖存放

apps/web/e2e/
├── dashboard.spec.ts
├── dashboard.spec.ts-snapshots/
│   ├── dashboard-full-chromium.png
│   ├── dashboard-full-firefox.png
│   ├── dashboard-full-webkit.png
│   └── host-card-chromium.png
└── ...

CI 整合

GitHub Actions

# .github/workflows/e2e.yaml
name: E2E Tests

on:
  pull_request:
    branches: [main]

jobs:
  e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: pnpm install

      - name: Install Playwright browsers
        run: pnpm exec playwright install --with-deps

      - name: Run E2E tests
        run: pnpm exec playwright test
        env:
          BASE_URL: http://localhost:3000

      # 上傳測試報告
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: playwright-report
          path: apps/web/playwright-report/
          retention-days: 30

      # 上傳截圖與錄影
      - uses: actions/upload-artifact@v4
        if: failure()
        with:
          name: test-results
          path: apps/web/test-results/
          retention-days: 7

測試報告

HTML 報告

# 本地查看報告
pnpm exec playwright show-report

報告內容

  • 所有測試結果 (通過/失敗/跳過)
  • 每個測試的截圖
  • 失敗測試的錄影
  • 錯誤堆疊追蹤
  • 測試執行時間

除錯工作流程

失敗測試處理

  1. 查看 CI Artifacts 下載測試報告
  2. 開啟 HTML 報告查看失敗原因
  3. 觀看錄影了解失敗時的畫面狀態
  4. 比對截圖差異找出視覺問題
  5. 本地重現並修復

本地除錯

# 有頭模式執行 (可看到瀏覽器)
pnpm exec playwright test --headed

# 除錯模式 (可暫停/單步)
pnpm exec playwright test --debug

# 只執行失敗的測試
pnpm exec playwright test --last-failed

變更記錄

日期 版本 變更 作者
2026-03-20 v1.0 初版建立 CPO

此文件由 CPO 維護E2E 測試必須遵守此配置。