木鸡 SteadyGame Alpha 冲刺测试随笔:从“能跑”到“可回归”

木鸡SteadyGame 木鸡SteadyGame 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

木鸡 SteadyGame Alpha 冲刺测试随笔:从“能跑”到“可回归”

项目内容
课程202601 福大-软件工程实践-W 班
作业站立式会议+α冲刺
团队木鸡 SteadyGame
测试对象体感运动平台:平衡小球、切水果、八段锦
代码基线feat/mobile-pose-mvp @ 475ebff(2026-10-29)
仓库SteadyGame

目录

  • 木鸡 SteadyGame Alpha 冲刺测试随笔:从“能跑”到“可回归”
  • 一、测试工作怎么安排
  • 测试分工
  • 二、测试工具选择和运用
  • 三、测试用例文档
  • 1. 八段锦阶段机
  • 2. 回放与提交
  • 3. 数据与接口
  • 4. 页面与输入
  • 四、实际测试结果
  • 测试证据
  • 五、测试体会
  • 1. 自动化测“确定性”,手工测“真实世界”
  • 2. 固定输入比“多点几次”可靠
  • 3. 断言要测行为,不要测实现细节
  • 4. 环境也是测试的一部分
  • 5. 不要把测试数量当质量
  • 六、项目测试评述
  • 做得好的
  • 还不够的
  • 建议
  • 七、AI 技术员在测试中的作用
  • 八、结语

一、测试工作怎么安排

这次 Alpha 冲刺只有七天,测试不能等开发做完再补,只能和开发并行。我们的安排是:

阶段测试重点主要产出
Day1–2契约、姿态字典、轮次与页面骨架类型检查、字典/契约单测、样例数据
Day3–4阶段机、玩法计分、结果提交、准备流程状态机用例、玩法契约用例、提交重试用例
Day5–6数据模块、导出、移动端适配、输入生命周期真实 MySQL 冒烟、页面四态、输入/资源释放用例
Day7主干统一回归、端到端、真机边界npm test、mvn test、构建、验收记录

具体做法:

  1. 每次合并前自测:前端 npm test、npm run build,后端 mvn test、mvn verify;
  2. 每天主干统一跑一次:避免“各分支都绿、合起来红”;
  3. 缺陷走 Issue:记录复现步骤、预期/实际、影响范围,修复后补回归用例;
  4. 测试也留证据:保留原始输出、JSON 结果、截图和提交记录,不用一句“已测试”代替结果。

测试分工

按《SteadyGame Alpha 七天开发与协作计划》,测试不是某一个人的专职工作:

  • 前 6 天各自开发、各自准备可执行样例和自测;
  • 第 7 天全员集中测试,每个人都要执行自己模块以外的用例;
  • 模块负责人负责修复缺陷和提供复现样例,不负责“自己证明自己通过”;
  • 修复后由非修复人重跑失败用例,共用碰撞改动还要回归小球和水果。
成员共同测试之外的代码/测试关注点
林晨状态、网关、轮次、导出任务;统一版本和最终集成结果
郑雯心摄像头、模型、资源释放;设备异常的真实复现条件
王婉怡映射、门控、校准、连续性;识别质量风险和参数记录
林宇扬小球规则、结果、冻结;与非本人复核者回归
林凯水果与共用碰撞;通知小球负责人同步回归
李想两式阶段、反馈、尝试、汇总;与共同测试者复演
孙田田页面与数据呈现;真实运行素材和答辩展示
刘婷婷校验、事务、身份归属、保存、下载;最终验收矩阵

二、测试工具选择和运用

我们没有追求“工具越多越好”,而是按“能测什么、测不了什么”来选。

工具用在什么地方局限
Vitest 5 + jsdom纯逻辑、状态机、提交重试、Vue 组件没有真实摄像头、Canvas、媒体解码
Vue Test Utils准备页、训练页、结算页交互DOM 模拟,不能替代真机
TypeScript + vue-tsc类型契约、接口字段类型正确 ≠ 运行正确
Vite build生产构建、资源引用不验证业务行为
JUnit 5 + Spring Boot Test后端 service/controller/repository依赖测试配置和数据库
Mockito隔离 gateway、外部依赖过度 mock 会掩盖集成问题
Flyway + MySQL 8.0.46迁移、约束、真实 HTTP 冒烟需要独立测试库,不能连生产
H2快速集成测试与 MySQL 行为有差异
PowerShell 冒烟脚本CSRF、登录、保存、越权、CSV 下载依赖服务已启动
MediaPipe 固定姿态/回放无摄像头复现八段锦完整流程只验证算法输入输出,不验证真人识别
Chrome + iQOO 手机真实摄像头、移动端布局、权限人工执行,难自动化

测试分层大致是:

单元测试(Vitest / JUnit)
  → 契约测试(OpenAPI 字段、状态码、错误码)
    → 集成测试(H2 / 真实 MySQL)
      → 端到端(回放 → 预检 → 提交;浏览器 + 摄像头)
        → 手工验收(真机、弱光、遮挡、多人)

三、测试用例文档

用例主要放在三类位置:

  • src/**/*.spec.ts:前端单元/组件用例;
  • server/src/test/java/**:后端 service、controller、repository 用例;
  • docs/acceptance/*.md、docs/baduanjin/*.md:验收清单与真机记录;
  • contracts/SteadyGame.openapi.json:接口契约,测试直接读取比对。

举几组实际用例:

1. 八段锦阶段机

用例输入预期
完整托天ready 0.8s → raise 0.5s → hold 1.5s → recover 0.8s4 个阶段依次完成
单举左右左手在上、右手在下只累计左侧,不误判右侧
连续丢点3.2s 无有效 features生成 pose_invalid 失败尝试
保持不足hold 只坚持 0.5s 后失效不产生 completed,hold 清零
暂停恢复暂停 2s 后恢复游戏时间冻结,保持进度从 0 重新累计
900s 上限持续 update 到 900s自动 aborted,不抛异常

2. 回放与提交

用例输入预期
完整回放固定 7.2s 脚本8 条 attempts、score=null、两式各 1 次
中途退出只跑前 3 段outcome=aborted,已产生尝试保留
非法结果score=10预检抛 BaduanjinResultError,不调用提交接口
提交失败重试429/5xx/网络错误退避重试;409/401/403 不重试
重复提交同一 session 同一结果返回原结果,不重复计分

3. 数据与接口

用例输入预期
22 个路由覆盖读取 OpenAPI operation与 Spring 实际映射一一对应
11 张表迁移V1/V2表、主外键、唯一约束齐全
同一轮次第二个结果重复插入1062 主键冲突
账号和游客同时写非法 owner3819 约束拒绝
未登录保存无 Cookie401/403
保存他人轮次他人 sessionId404
导出下载已生成任务200、Content-Type、字节数正确;未登录 401

4. 页面与输入

用例输入预期
页面四态加载/空/正常/错误错误态不残留上一次成功数据
390×844 移动端6 个页面无横向滚动、无角标遮挡
拒绝摄像头权限拒绝显示失败原因与重试入口
无帧超时推理循环停止看门狗判 stale,冻结推进
连续启停三轮开启/退出轨道、模型、推理循环释放

四、实际测试结果

Day7 当前工作树(feat/integration-linchen-day7)的测试结果:

范围结果
前端 Vitest35 个测试文件 / 377 项通过,0 失败
后端 JUnit73 项通过,0 失败、0 错误、0 跳过
前端生产构建vue-tsc -b && vite build 通过,92 个模块
依赖审计全量 2 项高危开发依赖;生产依赖 0 漏洞
接口检查GET /api/games 返回 HTTP 200
真机只截了页面状态,未授权摄像头,未完成真实识别/训练

当前自动化统计:

前端 377/377
后端 73/73
构建通过

这些数字只代表自动化用例和构建,不代表真实摄像头、真实 MySQL 全链路、非空导出和部署已经通过;这几项在验收边界里单独说明。

测试证据

img

【插图 01:Day7 测试结果汇总】

测试结果汇总页:前端 377/377、后端 73/73、构建通过。

img

【插图 02:本机运行的玩法首页】

玩法首页:本机 Vite 站点,三种玩法入口正常显示。

img

【插图 03:准备页面(摄像头未授权)】

准备页:摄像头未授权时“开始训练”保持禁用。这张图证明页面状态,不证明识别成功。

img

【插图 04:训练页预览】

训练页:路由和预览区已打开,但未开始真实训练。截图只能证明页面可展示,不能证明摄像头识别通过。

img

【插图 05:统计与报告页面回归】

统计页错误态、统计页样例数据、报告页空态。

img

【插图 06:报告与榜单页面回归】

报告页错误态、榜单页错误态、榜单页样例数据。

img

【插图 07:历史与导出页面回归】

历史页空态、导出页阻塞态、导出页演示状态。

以上 9 张图用于证明页面四态和样例展示,不是真实接口、真实训练或导出成功的凭据;原图在 测试随笔-图片/页面回归状态/。

冲刺中还遇到过这些真实问题:

  1. MySQL 启动失败:secure-file-priv 指向的 Uploads 目录不存在,服务只报“无法启动”,日志才有真实原因;
  2. MediaPipe 模型加载失败:public/models、public/mediapipe/wasm 未执行 npm run setup:pose,手机端 404;
  3. 摄像头出流但姿态启动失败:<video> 还没出第一帧就启动推理,判 video_unavailable;
  4. 结束训练报 outcome 不一致:提前结束时玩法按实际进度返回 aborted,协调器请求的是 completed;
  5. 同意接口 501:后端 CameraConsentGateway 只有接口没有实现;
  6. 提交接口 501:BaduanjinService 曾是占位实现。

这些问题说明:“接口存在”“测试绿了”“页面能点”都不等于链路可用。

五、测试体会

1. 自动化测“确定性”,手工测“真实世界”

阶段机、计分、提交重试这类纯逻辑,用固定输入跑几百个用例很划算;但摄像头权限、弱光、遮挡、多人、手机浏览器兼容,自动化很难覆盖。两者不是替代关系。

2. 固定输入比“多点几次”可靠

八段锦的回放脚本把 7.2s 的动作、每段时长、尝试次数都固定下来。改规则后,时间线一变就能看出来;没有固定输入时,测试绿了也说不清是修对了还是换了个错法。

3. 断言要测行为,不要测实现细节

断言要测行为,不要测实现细节:错误场景应该断言状态码、错误类型或页面状态,不要依赖可变的提示文案。

4. 环境也是测试的一部分

Java 24 下 JaCoCo 0.8.12 插桩报 Unsupported class file major version 68;jsdom 没有真实 Canvas;模型文件被 Git 忽略;MySQL 目录权限不对就起不来。这些都不是业务 bug,但会让测试结果不可信,必须在测试记录里写清楚。

5. 不要把测试数量当质量

377 项通过听起来很多,但其中大量是纯函数用例;真正决定体验的摄像头、保存、导出、真机链路,仍然要靠集成和手工验收。测试报告应该同时写“通过了什么”和“没覆盖什么”。

六、项目测试评述

做得好的

  • 有明确分层:单元、契约、集成、端到端、手工;
  • 真实 MySQL 和真实 HTTP 冒烟,不是只用 mock;
  • 八段锦用固定脚本回放,问题可复现;
  • 提交重试区分 409/429/5xx,覆盖了真实网络异常;
  • 每天保留测试原始输出、截图和 Issue 证据。

还不够的

  1. 没有 CI 门禁:测试靠人工在合并前跑,容易出现“分支绿、主干红”;
  2. 没有浏览器自动化:Playwright/Cypress 缺失,页面四态和移动端仍靠手工;
  3. 真机验收不足:摄像头、弱光、多人、不同手机浏览器没有形成完整矩阵;
  4. 覆盖率没有门槛:JaCoCo 有报告,但没有“低于多少不能合”;
  5. 测试与实现会漂移:契约变更后,旧用例没有同步更新。

建议

  • 在 CodeArts 或本地脚本里加一条“合并前必跑”流水线;
  • 给核心模块设覆盖率下限,但不追求 100%;
  • 用 Playwright 覆盖登录、准备、结算、历史四条主路径;
  • 把真机验收表变成发布清单,未执行项不能标“通过”;
  • 每次契约变更必须同步更新契约测试和用例文档。

七、AI 技术员在测试中的作用

这次冲刺中,AI 技术员主要做了四类事:

AI 做的事具体方式人工怎么核对
生成用例按状态机、提交重试、数据约束生成边界用例人工确认断言是否符合业务规则
造固定输入生成 ActionFeatures 脚本、回放时间线、MySQL 夹具人工跑真实测试,检查时间线和数据
补异常分支409/429/5xx、暂停恢复、丢点、900s 上限人工确认错误码和状态转换
整理证据把原始输出、JSON、截图归档人工比对提交 SHA 和 Issue

AI 确实提高了写用例和造数据的效率,但也带来两个风险:

  1. AI 会写出“看起来对”的测试:比如只断言函数被调用,不检查参数和结果;或者把实现细节写进断言;
  2. AI 容易过度 mock:mock 掉数据库、摄像头、网络后,测试全绿但真实链路仍然失败。

我们的做法是:AI 生成的用例必须能在真实工程里跑,必须有明确的输入/预期;涉及真实设备、数据库、摄像头的结论,必须由人执行并留证据。没有执行的验证,不写成“已通过”。

八、结语

Alpha 冲刺的测试工作,最大的收获不是“写了多少用例”,而是学会了区分三种状态:

代码写了 ≠ 功能可用
测试绿了 ≠ 真实链路通过
页面能点 ≠ 用户可以完成

测试的价值,是让团队在合并前就知道“哪里会坏、为什么坏、坏了怎么复现”。自动化能守住确定性,手工验收才能守住真实体验;AI 可以加速前者,但不能替代后者。

...全文

相关推荐

【Trans论文复现】基于Agent的电力市场深度决策梯度(深度强化学习)算法建模研究(Python代码实现)

内容概要:本文围绕《【Trans论文复现】基于Agent的电力市场深度决策梯度(深度强化学习)算法建模研究(Python代码实现)》展开,深入探讨了如何运用深度强化学习中的深度决策梯度方法对复杂电力市场环境进行建模与仿真。研究通过构建多智能体系统,模拟市场主体在电力市场中的博弈行为与优化决策过程,重点实现了智能体在动态市场环境下基于深度神经网络的策略学习机制。文中详细阐述了算法的理论基础、模型架构设计及Python代码实现路径,涵盖市场出清、竞价策略优化、资源配置等关键环节,强调对电力市场动态演化过程的精准刻画与预测能力,为复杂能源系统的智能化决策提供了可复现的技术范式。; 适合人群:具备一定Python编程基础和机器学习背景,从事电力系统、能源经济、智能优化等相关领域研究的研发人员或研究生。; 使用场景及目标:① 掌握深度强化学习在电力市场中的建模方法;② 学习多智能体系统在复杂博弈环境下的决策机制;③ 实现电力市场竞价、调度与资源配置的仿真分析与优化。; 阅读建议:建议读者结合文中提供的Python代码与仿真环境动手实践,深入理解算法细节与模型构建逻辑,同时可参考相关文献进一步拓展至其他能源市场应用场景。

大龙不吃小鱼干

share_b0dd64dd072936e16da2f27bbd48bdc51791767975916.mp4

share_b0dd64dd072936e16da2f27bbd48bdc51791767975916.mp4

航达青云

使用UR5e协作机器人对钢管上固定曲线路径进行自动化超声波测厚的MATLAB、Simulink和URScript代码.zip

使用UR5e协作机器人对钢管上固定曲线路径进行自动化超声波测厚的MATLAB、Simulink和URScript代码.zip

天天Matlab科研工作室

不平衡电网下三电平逆变器仿真【延时相消法】(Simulink仿真实现)

内容概要:本文围绕不平衡电网条件下三电平逆变器的Simulink仿真展开,重点采用延时相消法实现电网电压正负序分量的有效分离与抑制,以应对电网不平衡引起的电流畸变与控制失稳问题。文档提供了完整的仿真模型架构,涵盖锁相环、坐标变换、延时相消模块、电流控制器及SVPWM调制等关键环节,详细展示了控制策略的设计流程与算法实现机制,旨在提升逆变器在复杂电网环境下的并网电流质量和动态响应性能,具有较强的工程应用与科研参考价值。; 适合人群:电气工程、电力电子与新能源并网领域的研究生、科研人员及从事逆变器控制系统开发的工程技术人员;需具备电力电子变换器原理、自动控制理论及Simulink建模的基础知识。; 使用场景及目标:①研究不平衡电网下三电平逆变器的正负序控制策略;②掌握延时相消法在多坐标系下正负序分离的技术实现;③构建高保真Simulink仿真系统,用于学术论文研究、项目验证或实际工程方案预研。; 阅读建议:建议结合相关参考文献与说明文档,逐步搭建仿真模型,重点关注延时模块参数设置、双dq变换的实现逻辑以及电流环控制器的调节效果,并通过对比实验验证不同电网条件下的控制性能。

茜姐_博客

产业园区如何提升创新资源的精准配置与高效利用?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN
评论 1
收藏 已收藏
分享
返回顶部