使用 Node.js 22+ 和项目声明的 pnpm 版本:
pnpm test # 工具函数、配置约束和前端流程测试
pnpm test:flows # 仅运行发布与账号流程测试
pnpm lint:check # ESLint 只检查,不修改文件;警告也会导致失败
pnpm exec playwright install chromium # 首次运行浏览器测试时安装
pnpm test:e2e # Chromium、生产构建、真实 Socket.IO 和 Service WorkerPR 的 Frontend tests 工作流执行 Node 测试、静态检查及独立的浏览器测试任务;浏览器失败时保留截图与 trace 7 天。生产部署现有 verify 阶段仍执行 Node 测试和静态检查,不需要在服务器安装浏览器。Node 流程测试沿用 Vite、Vue 和 Pinia,不需要启动 NPClassworksKV。
tests/accountRefresh.test.js 验证并发 401 只刷新一次、刷新请求在 10 秒内超时、临时故障保留凭据并可恢复、刷新凭据失效才清理登录,以及切换账号或退出时旧刷新响应不能写回凭据。
tests/e2e/publication.spec.js 点击真实 Vuetify 按钮并检查页面结果:
- 教师发布作业后,独立浏览器上下文中的大屏经真实 Socket.IO 通知自动更新。
- Service Worker 接管后断网录入、刷新页面,确认导航来自 Service Worker、缓存内容和待提交队列保留;恢复联网后补传且只有两条最终作业。
- 制造版本冲突,确认输入保留;点击人工确认后携带最新版本保存。
测试自动构建生产资源到 dist-e2e/,在本机 4180/4181 端口启动静态站点和隔离 API fixture;请保持这两个端口空闲。每个用例重置数据,每个角色使用独立浏览器存储,不访问线上数据。API fixture 不使用生产后端或数据库,因此这组测试证明浏览器交互、传输和 PWA 行为,服务端权限与事务仍由后端测试及部署环境联调验证。
tests/publicationFlows.test.js 实际执行生产代码中的 Vue 录入组件 setup、watcher、Pinia actions/getters、Axios 请求与拦截器,以及本地队列和草稿工具。Vite 使用独立配置加载源码,不加载应用开发服务器配置,也不连接线上服务。
- 离线录入成功后才发出保存/关闭事件,清理草稿;重新创建 Store 后从持久化队列恢复,避免并发补传重复发送。
- 存储写入失败时保留输入与草稿,不发出成功或关闭事件;恢复存储后可重试。
- HTTP 503 后暂存并重试,业务冲突进入人工处理,不进行自动重试。
- 首次提交前生成请求 ID,服务端已保存但响应丢失后,重新加载 Store 的补传仍使用同一 ID;旧队列由持久化条目 ID 补齐标识。
- 不同大屏绑定的队列隔离;过期作业需手动提交,不阻塞新作业自动补传。
- 离线修改已有作业不创建副本;版本冲突保留本机内容、读取最新版本,确认后携带最新
If-Match提交。 - 退出账号清理权限和凭据,退出 API 失败也不阻止本地退出。
- 旧账号的登录初始化、发布记录、待处理事项、偏好读取和保存响应不会覆盖新会话。
- 教师发布经 HTTP 保存后,另一大屏 Store 接收失效通知,执行实际订阅回调、防抖和 HTTP 拉取,更新 feed。
HTTP 使用监听 127.0.0.1 随机端口的隔离服务,实际校验请求体、账号/大屏令牌和版本头。响应由 fixture 控制,可精确制造延迟和错误;它不是生产后端实现,不能证明服务端鉴权、数据库事务或 Socket.IO 房间授权正确。
Node 流程测试的 Socket.IO 传输由可控事件源替代,本地存储由内存实现替代。录入组件挂载于 Vue 的无 DOM renderer,执行真实组件生命周期与交互逻辑,但不渲染 Vuetify 模板。上述浏览器测试另行覆盖按钮操作、Service Worker 离线导航和真实 Socket.IO;浏览器存储配额耗尽、多浏览器兼容性以及生产后端多设备联调仍不在覆盖范围内。
新增场景优先验证可观察结果(输入、草稿、持久化队列、发出的事件、HTTP 请求和最终 Store 状态),不以源码字符串存在作为交互正确的依据。修改学校管理权限时,也仍需新增对应组件交互和后端授权测试,不能依赖现有权限文案正则检查。