自动化测试框架需要什么样的前置条件
- 自动化测试代码需要能够独立地启动游戏,加载所需的资源,并直接跳过不相关的流程,直接步进到需要测试的流程。这个过程越短越好,因此,需要系统在设计上保证不同流程的解耦。例如系统能够在没有登录的状态下直接进入一个游戏场景,并根据配置生成相应的角色和系统。
- 对于联网游戏,自动化测试代码需要能够独立地生成服务器进程和多个客户端进程,并在客户端进程与服务端进程连接后,分别操纵不同的进程做不同的操作。虚幻引擎的Dedicated Server框架,就保证了这种能力。
对于游戏项目而言,什么样的测试比较合适
- 一些体验性的、视觉的测试没法做自动化测试,但游戏项目仍然有很多部分可以做自动化测试。
- 如果一个测试耗时太长,并且涉及进程太多以及易于受到偶然因素影响,那么说明这个测试设计得并不是很好。
- 如果一个特性还处于prototype阶段,那么没必要为其设计自动化测试代码。因此对于某些新特性而言,先设计测试用例的测试驱动开发方式可能会水土不服,因为有些原型阶段的特性很可能后面都不需要。
如何构建更健壮、效率更高的自动化测试
Actor Test
Sea of Thieves团队的自动化测试实践[1]中提出了一个概念叫Actor Test, 这是一种介于单元测试和集成测试中间的状态。Actor Test破坏了不少集成测试的标准:
- 例如启动进程、初始化代码、加载基础资源之后,依次创建若干个不同的集成测试场景,而不是每个集成测试都需要重启进程。
- 让性质接近的行为在同一张集成测试场景中测试,而不是严格地遵守每个测试用例不共用任何资源。
- 让一些初始化耗时巨大的模块在不同集成测试场景中复用,例如虚幻引擎的角色蓝图。
面对与动画、时间相关的行为该如何测试
- 一些跟时间有关的测试,使用手动调用引擎的Tick函数以代替真的执行特定时间。
- 一些行为的检测逻辑,可以使用轮询方式去调用。例如玩家施放了某个技能,判断其是否正确释放,如果检测N秒后行为是否正确释放,那么为行为添加动画、微调行为的释放前摇会不断地破坏这个测试用例。而更健壮的检测逻辑应该是,监听技能释放事件,当技能释放后对行为进行检测。这样可以使得测试代码更加健壮,不容易受到数据迭代的影响。
该使用什么粒度的测试
- 复杂的集成测试可以少量地用于行为成功的测试用例
- 边界条件、异常行为通常使用Actor Test和Unit Test去覆盖。
自动化测试作为构建系统的一部分
自动化测试代码集除了可以让开发人员在自己本地调用以外,还可以作为构建系统的一部分。让自动化测试代码每隔一段时间自动执行一遍,捕捉到测试失败后:
- 阻塞构建,防止构建出带缺陷的版本。
- 阻塞提交,防止后续新加入的代码引入更多的问题。