import { defineConfig, devices } from '@playwright/test'; const BASE_URL = 'http://127.0.0.1:3000'; const FRONTEND_URL = process.env.FRONTEND_URL || 'http://127.0.0.1:5173'; export default defineConfig({ // 测试目录(项目根 tests/ 下) testDir: '.', // 全局超时 timeout: 120000, expect: { timeout: 15000 }, // 失败重试 retries: process.env.CI ? 1 : 0, // 并行数 workers: process.env.CI ? 2 : 1, // 报告配置(含 AI 可读的 Markdown 摘要) reporter: [ ['list'], ['json', { outputFile: 'test-results/results.json' }], ['html', { outputFolder: 'test-results/report', open: 'never' }], ['./helpers/reporter.ts'], ], // 全局设置 use: { baseURL: BASE_URL, trace: 'retain-on-failure', screenshot: 'on', video: 'retain-on-failure', }, // 项目配置:冒烟测试 & 回归测试 & 关键旅程 & 根目录散件 projects: [ { name: 'smoke', testDir: './smoke', use: { ...devices['Desktop Chrome'] }, }, { name: 'regression', testDir: './regression', use: { ...devices['Desktop Chrome'] }, }, { name: 'critical-journeys', testDir: './e2e/ui/critical-journeys', use: { ...devices['Desktop Chrome'] }, }, { // 核心业务 E2E:书籍 大纲→内容→音频 完整链路 // 每次修改 book-generator / 发布上线前必跑 name: 'core-business', testDir: './e2e/core-business', use: { ...devices['Desktop Chrome'] }, // 单个 describe 内串行,因为所有断言共享同一本书的 bookId fullyParallel: false, workers: 1, // 单测超时:8 分钟(LLM + TTS 真实调用) timeout: 480_000, }, { name: 'root-singles', testDir: '.', testMatch: /(example-rotation|page-cleanup-screenshot|textarea-size)\.spec\.ts$/, use: { ...devices['Desktop Chrome'] }, }, ], // 全局 setup / teardown globalSetup: './global-setup.ts', globalTeardown: './global-teardown.ts', // Web 服务器(可选,也可手动启动) webServer: process.env.START_SERVER ? [ { command: 'npx tsx server/src/app.ts', port: 3000, timeout: 30000, reuseExistingServer: true, }, { command: 'npm run dev:h5', cwd: 'my-uniapp-vue3', port: 5173, timeout: 30000, reuseExistingServer: true, }, ] : undefined, });