许多游戏,尤其是MMO,会包含“副本”这个概念,玩家通过打副本从而获得物品奖励及属性收益。通常来讲,单个游戏所涉及的副本数量/品种较多,因此在游戏测试过程当中,很难一次性全部遍历完所有副本的流程与玩法。为了解决这个问题,可以通过自动化测试的方式去冒烟副本玩法流程、检查奖励。为了让自动化测试用例执行更加稳定且易于维护,需要一套通用的逻辑模版去实现副本玩法自动化。自动化测试流程涉及多个部分,包括玩家账号的准备、副本的进入、副本流程、奖励检查,而本文主要考虑“副本流程”的实现。
副本玩法的机制可以如下描述:玩家在进入副本后,服务器会为玩家创建一个分线并让玩家执行切线操作切入副本内,而后下发副本信息,客户端则缓存信息,为玩家创建场景及指引,而后玩家根据指引游玩副本内的内容。每当玩家执行了特定的行为,比如走到指引的位置/干掉指引的怪物,就会触发这些指引绑定的触发器,触发器生效后,服务器就会同步触发出来的下一阶段的信息给到客户端,客户端便展示出下一阶段的指引,直到副本结束或者发生错误、意外退出为止。从副本机制可以看到,副本玩法的每一个步骤,在客户端中都有缓存相关的信息,在自动化的实现上,只需要每一个轮次读取副本信息,执行相关的行为即可(任务也是如此)。因此,我们可以设计如下的行为来自动跑副本:
首先需要定义副本信息状态State
,每当状态发生变更,就说明自动化执行的行为取到了一定进展。针对状态是否变更,需要定义两类行为:OnStateChanged
和OnIdle
,分别对应状态变化与状态未变化(闲置)的情况。OnStateChanged
里可以实现一些副本玩法常见的操作,而OnIdle
方法可以集合某些副本里特殊的操作,这样可以保证副本行为的通用性。副本行为用一个循环表示,每个循环会更新当前副本信息状态,执行OnStateChanged
或OnIdle
。当OnStateChanged
或OnIdle
报错,或者OnIdle
执行到一定的次数时,判定副本执行失败;当执行完一轮对应的后还需判断副本玩法是否已不可玩,如果还可玩的话就要继续循环,不可玩即检查副本是否已经成功完成。
整个流程设计可以如下图所示:
针对不同的副本玩法,可以在这个模板基础上进行不同的行为实现。如果副本流程更为复杂,可以在流程的各个节点增加钩子函数,并由子类实现钩子函数,从而应付一些特别的需求。如果有行为树等UI框架支持的话,描述副本行为将会变得容易很多,可以开个好头,但从中的细节,各个行为具体的实现,还需要根据实际情况仔细调试,这里也是耗费工作量最大的地方。