Last Updated: 2026-05-04
本页唯一负责:维护前端专属测试布局、Node 工具链命令、Vitest / MSW / Playwright 细节与浏览器 smoke 约束。
项目级测试总览、本地验收语义和真实 provider E2E 统一见 testing-and-e2e.md。
前端测试文件统一位于:
tests/frontend/
├── components/
├── e2e/
├── fixtures/
├── hooks/
├── lib/
├── msw/
└── setup/
对应配置文件位于:
src/frontend/scripts/run-playwright.cjs
src/frontend/vitest.config.ts
src/frontend/playwright.config.ts
在仓库根运行:
uv run python run_tests.py frontend
uv run python run_tests.py frontend-e2e
uv run python run_tests.py frontend-coverage在前端目录运行:
cd src/frontend
npm run test
npm run build
npm run test:e2e
npm run test:coverage
npm run test:ci命令语义:
npm run test:Vitestnpm run build:Next.js 构建与类型回归npm run test:e2e:Playwright 浏览器 smokenpm run test:ci:Vitest + build + Playwright
当前 Vitest 栈:
Vitest@testing-library/react@testing-library/jest-domMSWjsdom
当前覆盖重点:
api-clientcontracts- hooks
- 关键组件与组合层
../src/frontend/vitest.config.ts 当前关键约束:
include指向根tests/frontend/**/*.{test,spec}.{ts,tsx}exclude明确排除tests/frontend/e2e/- 通过 alias 指向前端
node_modules和根目录tests/frontend/setup @testing-library/react/@testing-library/user-event统一走稳定包入口,不再绑定到包内部dist路径
tests/frontend/setup/vitest.setup.ts 负责:
- 注册
jest-dom - 清理
localStorage - 复位 MSW handlers
- stub
confirm/alert - stub
navigator.clipboard - stub
URL.createObjectURL/URL.revokeObjectURL
tests/frontend/msw/handlers.ts 默认覆盖:
GET /api/statusGET /api/sessionsPOST /api/startPOST /api/stopGET /api/sessions/:idDELETE /api/sessions/:idGET /api/sessions/:id/treeGET /api/sessions/:id/nodes/:nodeIdGET /api/sessions/:id/report
html2pdf.js 在 Vitest 层通过 tests/frontend/setup/stubs/html2pdf.ts 替代真实导出逻辑。
../src/frontend/playwright.config.ts 会自动启动两个本地服务。
npm run test:e2e 当前通过 ../src/frontend/scripts/run-playwright.cjs 启动官方 Playwright CLI,目的是让仓库根的 tests/frontend/e2e/ 仍然使用标准 @playwright/test 入口,同时正确解析前端自己的 node_modules。
命令:
uv run python -m src.backend.main关键环境变量:
APP__MOCK_LLM=trueAPP__DEBUG=falseAPP__API_PORT=<playwright-backend-port>APP__FRONTEND_HOST=http://127.0.0.1APP__FRONTEND_PORT=<playwright-frontend-port>MCTS__MAX_SIMULATIONS=2MCTS__PARALLEL_WORKERS=1SECURITY__API_TOKEN=test-tokenSTORAGE__DATA_DIR=<temp>STORAGE__SESSIONS_DIR=<temp>STORAGE__LOGS_DIR=<temp>
命令:
npm run build && npm run start -- --hostname 127.0.0.1 --port <playwright-frontend-port>关键环境变量:
NEXT_PUBLIC_API_HOST=http://127.0.0.1NEXT_PUBLIC_API_PORT=<playwright-backend-port>NEXT_PUBLIC_API_TOKEN=test-token
补充约束:
- Playwright mock smoke 不依赖任何 provider 专属别名变量,继续使用
MCTS__MAX_SIMULATIONS=2 - 当 provider 为
deepseek时,后端真实模型链路仍只使用LLM__GENERATION_MODEL和LLM__DECISION_MODEL - 当 provider 为
deepseek时,run_tests.py frontend-e2e deepseek会把E2E_MAX_SIMULATIONS映射到PLAYWRIGHT_MCTS_MAX_SIMULATIONS,把E2E_BRANCH_FACTOR映射到PLAYWRIGHT_MCTS_BRANCH_FACTOR - DeepSeek Playwright smoke 默认使用
PLAYWRIGHT_MCTS_MAX_SIMULATIONS=1、PLAYWRIGHT_MCTS_BRANCH_FACTOR=2;真实 API key 只通过E2E_DEEPSEEK_API_KEY进入当前进程环境
- jsdom 层不深测 React Flow 内部布局和拖拽细节
- 浏览器 smoke 只保留一条主干 happy path:
- 首页加载
New ExplorationHistory中出现 session- tree 出现节点
- 点击节点打开
Node Details Stop & Report打开Exploration Report- 关闭报告后从
History点击Resume Session - 回到树工作台并继续显示当前 session
- 恢复后断言以“树仍可见、临时面板被关闭”为准;mock 模式下 session 可能很快再次完成,不要把
Resume Session按钮瞬时消失当成稳定条件
- 不做多浏览器矩阵
- 不做视觉回归
- 不做前端真实 provider 矩阵