import { defineConfig, devices } from '@playwright/test' const BASE_URL = process.env.E2E_BASE_URL || 'http://127.0.0.1:5090' /** * E2E(Playwright)。与 Vitest 的分工: * vitest → `src/**\/*.{test,spec}.ts`,happy-dom 里的单元测试(见 vitest.config.ts) * playwright → `e2e/**`,真实浏览器 + 真后端 * * `testDir` 必须限定为 `./e2e`:Playwright 默认的 testMatch 会顺着包目录把 * `src/**\/*.spec.ts` 也收进来,那样 vitest 的用例会被塞进浏览器跑,报一堆莫名其妙的错。 * * 前置条件:后端已在 8088 起来(见 CODEBUDDY.md)。前端 dev server 由下面的 webServer * 负责,已经在跑就复用(不会重复占 5090)。 */ export default defineConfig({ testDir: './e2e', fullyParallel: true, forbidOnly: Boolean(process.env.CI), retries: process.env.CI ? 1 : 0, reporter: process.env.CI ? [['list'], ['html', { open: 'never' }]] : [['list']], // 整轮只在这里登录一次,原因见 e2e/support/session.ts 的「互踢」说明 globalSetup: './e2e/support/global-setup.ts', // dev server 是按需转译的:某个页面**第一次**被访问时要现编整张依赖图,冷启动实测 5-11s。 // 用默认的 5s expect 超时会表现为「同一个用例时好时坏」,所以统一放宽。 // 后端慢(登录/菜单查询走远程 SQL Server)也吃这个时间。 timeout: 60_000, expect: { timeout: 15_000 }, use: { baseURL: BASE_URL, actionTimeout: 15_000, navigationTimeout: 30_000, trace: 'retain-on-failure', screenshot: 'only-on-failure', }, projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'], // 下载 Playwright 自带 Chromium 不便时(慢网 / 离线 / 公司代理), // 用系统已装的浏览器:E2E_CHANNEL=msedge 或 E2E_CHANNEL=chrome channel: process.env.E2E_CHANNEL || undefined, }, }, ], webServer: { command: 'pnpm dev', url: BASE_URL, reuseExistingServer: true, timeout: 120_000, }, })