要做游戏自动化测试,首先需要了解游戏自动化技术。因此,本文详细讲解下游戏自动化测试领域可能用到的一些技术以及对应的场景,为自动化测试落地的技术选型提供参考。
游戏自动化测试的测试对象是游戏本身。对于游戏这个概念,可以有以下几种:
我们在技术层面上所要做到的,就是通过某些方式访问这些程序运行环境产生的内容,改变游戏呈现以及玩家行为,操作玩家或游戏程序本身,达到我们的测试目的。在笔者的工作经验当中,主要做的是UE安卓客户端的自动化,应用场景主要在业务功能测试方面,因此本文会对客户端自动化做稍微详尽的解析。其他自动化的方案和叙述,如果其中描述有所纰漏,恳请指正。
针对游戏客户端的自动化,在游戏测试里是最为广泛应用的,不仅是因为客户端是一个游戏必须有的成分,而更加因为我们在手工测试游戏的时候,实际是拿着客户端来测的。因此,客户端自动化会最贴合游戏功能测试的需求。
要实现客户端自动化,有以下的方法:
lua、js)编写的游戏。adb之类的方式直接模拟屏幕操作;也可以在游戏中运行一个UI自动化模块,测试人员可以向这个模块请求对某个UI发起点击/按下/释放的操作,而后这个模块内部执行UI实例OnClick/OnPress/OnRelease的委托。dispatch,去执行对应封装好的指令。客户端自动化的开源实现也有不少,其中有两个比较广泛应用:Airtest和GAutomator。
Airtest:一个完整的游戏自动化测试方案,参考这个文档
Android/iOS的Native控件,也支持Unity/UE/Cocos应用。GAutomator:针对Unity、UE的UI自动化测试框架,源码在这里
Airtest比较轻量级,适合集成+二次开发一般来讲,开源的自动化方案基本上是UI自动化相关,而脚本自动化和指令自动化,则需要依据不同游戏项目的实现去自定义相关逻辑。
客户端自动化适用于以下的场景:
Buff或是技能效果的遍历测试。不论是功能还是专项测试场景,在自动化行为的实现上,脚本、UI、指令三种自动化方式都可以相互结合。这是因为,从游戏测试用例过程的角度来看,每一个步骤其实都是一个玩家操作,而玩家操作的实现,可以是发一段脚本,也可以是点某个UI,更可以是执行一个指令。
相对于其它自动化方式,脚本自动化的实现方案是最优先的,这是因为能够支持热执行客户端脚本的话,理论上可以操纵整个客户端的运行,从而能够满足更多自动化行为的需求。因此如果有条件,比如说测试侧有项目的源代码权限,那么自动化行为的实现,就优先采用脚本编写的方案,而对于一些需要复杂脚本实现的行为,才用UI操作代替。如果没有源码条件,也可以考虑在客户端源码里抽出一个单独的project,包装项目代码API类型信息以及一系列自动化指令,做成一个测试侧也可以单独维护的自动化底层模块。
针对服务器的自动化测试是非常关键的一部分。比如我们经常提到的服务器压测,其实本质上是一种自动化驱动的逻辑。从整个游戏产品的质量保证而言,服务器自动化同样是不可或缺的。
要实现服务器自动化,一般是两种方法:
C/S协议交互的方式驱动游戏逻辑进行
C/S协议,从而驱动玩家做某些行为,或者是达到某些状态。C/S协议,而是通过某些外部调用,或者是这个机器人发送某个特定的指令,驱动服务器逻辑,从而让机器人参与到某些测试活动当中。具体的技术实现,实际得依据服务器本身的技术栈以及协议交互的技术栈而定,并没有一套确定的方案。
服务器自动化适用于以下场景:
CI流水线使用。Boss等涉及海量玩家参与的玩法模块。编辑器代表着游戏的开发环境,其中的资源会直接影响到游戏的构建结果,因此针对编辑器及资产的自动化测试也是重要的一部分。以UE为例,其中内置了许多自动化测试的机制:
python脚本驱动编辑器和运行的手段,可以作为编辑器开发环境的提效工具,也可以对编辑器资产做测试检查UE游戏会话,执行简单的测试内容,是用Gauntlet框架实现的。编辑器自动化适用于以下的场景:
excel配置可能是分离的,由于在本文范畴中,excel配置不直接影响游戏构建结果,因此关于excel配置的合规性检查暂不纳入本文叙述范围。PIE,在游玩期间进行功能测试。
客户端/服务器/编辑器自动化技术,是游戏自动化实现的最底层逻辑。在此基础上,还可以加码一些周边技术包装,从而优化自动化测试的效果。
通常在微服务测试中,会通过录制的方式记录真实访问的流量,作为测试用例,然后在测试环境随时回放,从而起到观测真实流量反映的作用。
在游戏自动化中,也存在录制回放的操作,服务器跟客户端都能做。以客户端为例,录制回放主要是在UI测试中应用,技术实现上大致有两种方法:
客户端UI测试的录制回放技术,可以用到的场景有:
行为树是AI的一种实现,主要通过行为抽象+流程控制的方式,实现AI机器人的自动决策。
在自动化测试领域,通常会提到AI自动化,而行为树就是AI自动化的一种典型案例。但这里需要强调的是,AI驱动并不是最底层的自动化技术,以运行在游戏客户端的行为树为例,每个行为本身的实现,还是得走UI自动化、脚本自动化的套路。AI驱动的,只是业务逻辑,不是游戏本身。
行为树决策的逻辑是人为制定的,因此引入行为树,会很适合一些操作复杂,耗时长,但比较有规律的测试场景,让这些场景实现自动化的成本大大降低。比如说:
针对自动化测试本身而言,行为树也可以帮助我们快速确定基础的自动化逻辑结构,生成基础代码,提高自动化研发效率。但也需要注意,行为树不能作为代码编程的完整代替方案,否则一旦行为复杂度较高,行为树本身就难以维护,详情可以参考这篇文章。
行为树方案,建议是配套可视化编程工具提效开发和调试工作,否则研发效率并不一定优于纯粹的代码编写。
机器学习是一种更为复杂的AI实现案例,有几个特点:
因此机器学习的方案,可以考虑在几个自动化测试的场景应用: