testing-strategy.md 6.8 KB

前端测试方案

dashboard-v6 · React 19 + Vite + Ant Design · 记录于 2026-09-07 实现位于独立目录 mint/dashboard-test,运行方式见 README


目标

把「人工点页面 + 肉眼看 console」的手工测试,交给 AI 助手(Claude Code)在容器内自动完成, 同时不改动 dashboard-v6 的依赖——测试代码与依赖全部隔离在独立目录 mint/dashboard-test


方案总览

层面 选择 说明
浏览器驱动 Playwright Test(headless chromium) 独立目录 dashboard-test 的 devDependencies
运行位置 开发容器内 与 dev server 同一网络,直连 127.0.0.1
交互方式 @playwright/test spec 文件 而非 MCP 逐步操作,理由见下
采集内容 console 日志、pageerror、HTTP 4xx/5xx、请求失败、截图

为什么不用 Playwright MCP

MCP 每步一次工具调用,交互性确实更好,但有四个代价:

  1. 上下文消耗大 —— 每步返回整页 accessibility snapshot,中等复杂度页面就是几万 token, 点十次即耗尽上下文。脚本方式一次跑完只回来十几行日志。
  2. 每步一次往返 —— 「登录 → 列表 → 筛选 → 详情 → 断言」= 5 次调用。测已知流程时纯浪费。
  3. 不留资产 —— 点完即逝,下次重测要从头再点;脚本是文件,可重跑、可沉淀为回归测试。
  4. 不确定性 —— 同样指令两次可能点到不同元素;脚本里的选择器是确定的。

结论:探索性调试(不知道页面哪坏了、需要边看边试)可临时启用 MCP; 已知流程的重复验证一律用脚本。 当前默认走脚本。


环境

依赖安装位置

测试是一个独立的 npm 工程 mint/dashboard-test,与 dashboard-v6 完全隔离:

cd dashboard-test
npm install                      # @playwright/test + @types/node,均在 devDependencies
npx playwright install chromium

dashboard-v6 的 package.jsonpackage-lock.jsonnode_modules 零改动

dev server 启动

由 AI 在后台启动,端口如下:

服务 命令 地址
api-v13 后端 cd api-v13 && php artisan serve http://127.0.0.1:8000
api-v13 前端 cd api-v13 && npm run dev http://127.0.0.1:5173(占用则 5174)
dashboard-v6 cd dashboard-v6 && npm run dev http://127.0.0.1:4000/pcd-v2026/

实现要点

  • 登录src/tests/auth.setup.ts 作为 setup project 跑一次登录, storageState 存到 playwright/.auth/user.json,各用例通过 dependencies: ['setup'] 复用(官方推荐模式)。
  • 日志采集src/lib/collect.tsconsole / pageerror / requestfailed / response>=400,并过滤掉 antd、React 开发态的已知废弃警告, 只留真正值得看的内容。这是替代"人肉盯控制台"的关键。
  • 已知缺陷写成断言:发现的 bug 直接写进 expect,注释标注 BUG 编号, 修复前保持红灯,修复后自动变绿——测试同时充当回归网。
  • 失败留证trace: 'retain-on-failure' + video: 'retain-on-failure', 失败用例可用 npx playwright show-trace 逐帧回放。

目录约定

路径 内容
src/tests/<路由名>.spec.ts 一个路由一个 spec
src/tests/auth.setup.ts 登录并保存 storageState
src/lib/collect.ts 日志采集与噪音过滤
README.md 运行方式与环境变量
documents/development/testing-strategy.md 本文:方案取舍与约定
documents/testlog/<路由名>_<时间戳>.md 每次测试的日志,待修项用 - [ ] 代办标记
documents/testlog/assets/<路由名>_<时间戳>/ 该次测试的截图,在 md 中内嵌引用

目录布局参照 dashboard-v6:代码在 src/,文档在 documents/

时间戳格式 YYYYMMDD_HHMMSS,例:channel_20260907_034904.md

测试日志固定结构:概览表格 → 结论 → 一、通过的功能(含截图)→ 二、待修复(每条一个 - [ ] 代办,含日志片段、截图、定位到文件行号的原因、修复方向)→ 三、未覆盖(破坏性操作等)。

破坏性操作(新建、保存、删除)在开发机上实际执行。约定:

  • 只操作脚本自己创建的临时数据,命名 e2e-tmp-<timestamp>
  • 测试结束必须清理,日志中声明「未留残留数据」
  • E2E_DESTRUCTIVE=0 可跳过这部分
  • 涉及第三方(转让、分享授权)的操作仍只验证弹窗渲染,列入「未覆盖」

待办

  • 登录态harness.login() 走一遍登录流程后用 context.storageState() 存到 .auth.json(已 gitignore)复用。测试账号通过 E2E_USER / E2E_PASS 传入。
  • 脚本入库:已迁到独立工程 mint/dashboard-test,随代码进 git, 依赖隔离在自己的 package.json
  • 端口冲突:5173 常被宿主机上已有的 dev server 占用,注意避免重复启动。

未来方向(需要时再动依赖)

若接受修改 package.json,业界主流组合为:

层面 方案 备注
单元/组件 Vitest + React Testing Library 已基本取代 Jest;browser mode 在真实浏览器跑组件测试
E2E Playwright ✅ 已采用(本目录)
API mock MSW 网络层拦截,单测与浏览器共用一套 handler
视觉回归 Playwright toHaveScreenshot() 需团队协作看 diff 才上 Chromatic / Percy

E2E 一层已落地。单元/组件测试要落地必须动 dashboard-v6 的 package.json, 待需要时再议。