LyraStarterGame 是 Epic 的 UE 教学项目,第三人称射击,带武器、装备、队伍、HUD 一整套系统。我拿它做了一次完整的游戏项目测试,从测试宪章到封板,96 个 CQTest 自动化用例全绿。这篇文章讲方法和结果,完整测试文档在文末。

先定测什么:测试宪章

动工之前先划范围。范围落在 8 个游戏系统加性能专项:武器与装备、控制、相机、HUD、前端页面、音频、队伍、初始化链路,性能测试单独算。状态系统评估后移除,事件测试(死亡、重生这类跨系统链路)独立成册。

范围上做了几个决定:

  • 黑盒测试为主。除非明确标自动化,一律从玩家视角描述。
  • 不单独测 GAS。Gameplay Ability System 不设独立系统,相关功能归进各系统的细则。
  • 网络不单独设模块,多线程/复制场景作为每个系统的细则考虑。
  • 边界值测试包含 0、负值、正常值三种。
  • 测试方式只有两种:C++ CQTest 跑重复性高的用例(数值边界、状态流转、输入模拟、回归验证),手工跑需要视觉、手感、听感判断的用例。蓝图功能测试弃用。

CQTest 是什么

CQTest 是 Epic 的 C++ 测试框架,测试直接跑在游戏进程里。它比蓝图功能测试强在测试是文本,能 diff、能批量改、CI 好接;比纯手工强在能反复回归。

最后 96 个用例分布:武器与装备 21、控制 30、事件 13、初始化链路 5、相机 9、音频 8、散布 10。每个套件对应一个 .spec.cpp 文件。

手工部分

自动化覆盖不了视觉、手感、听感。三个手工 Session:

  • Session 1:武器动画、装备动作
  • Session 2:控制动画、视角、相机
  • Session 3:HUD、队伍、音频

测出来的问题

封板时 4 个已知问题,没有阻塞级:GravityScale=0 时动画蓝图除零、Dash 中操作行为不一致、射击途中换弹被静默拒绝、装备时武器先显示后播放拿出动作。除零那个就是 CQTest 发现的。

自动化里还逮到一条竞态:双重生 Pawn 抢占 PlayerState 的 AbilitySystemComponent,加上死亡能力异步授予,出现”血量归零但死亡状态不转换”。修法是加 3 帧稳定、一致性、死亡能力门禁,修完连跑 3 次全绿。

封板口径

封板口径是功能封板:自动化全绿 + 无阻塞 Bug 就算,不推上线,成果本地 commit。没做完的显式进 backlog:性能测试 36 实例、探索性测试 6 轮、DT-04 网络同步、SP 剩余子状态、前端页面覆盖。都记下来了,不假装完成。

完整测试文档

全部文档(总纲、测试计划、用例分级清单、系统测试用例、Bug 报告、执行计划)合并成了一个页面:LyraStarterGame 测试文档