如何教AI吃鸡?
导读:光看标题,你可能会以为今天会聊一个休闲的话题,不不,今天我们将要认真聊的,是一个严肃的软件工程话题:自动化测试。具体来说,是手机游戏的自动化测试。不是别家的游戏,正是腾讯游戏,保证半点也没有标题党。(坚持看完有福利)
学过软件工程的同学应该都知道,软件工程是一门老师都可能随时不知道自己到底在讲什么的计算机专业课。不过,这不是本篇的重点。
软件工程告诉我们很多重要的事,其中一件事是软件都有一个生命周期。没错,一说软件开发,我们都会很自然想到写代码,但软件工程告诉我们,写代码远不是软件开发的全部工作,甚至还不一定是最重要的工作。
按照软件工程的说法,开发软件你得首先和客户谈笑风生,这叫需求分析,接着就是各种写不完的文档和开不完的研究会,都弄好以后,差不多就可以把“码农”找过来,把满头青丝编成代码。
你以为这就完了?没有!从软件编码到软件正式上线部署之间,有一个非常重要的阶段,叫软件测试,俗称Debug。Debug完了软件该上线了吧?NoNoNo,城里人的套路深着呢,还有QA和QC在前面等着。等着干嘛呢,翻来覆去地花式折腾你的程序,目标只有一个,加油努力把程序玩脱。
照一些软工书本的说法,软件开发最重要的是需求,其次是测试,接着可能是什么三姑六婆,至于程序员死了都要爱的写代码环节,在软工书里经常是三甲不入的,没啥存在感。
当然了,理想很丰满,现实很骨感,干了一辈子程序员,从没见过活着的QA、QC的也大有人在。所以,象牙塔里的软工老师,讲着讲着能把自己绕晕也不足为奇,这里就不展开了。
但是有一点,虽然大公司、小公司、以及不同流派的开发团队,在软件工程上的玩法各不相同,但有一点毫无疑问,软件测试是软件开发必不可少的环节。前面说过,软件测试就是花式折腾程序,直到折腾出毛病来。
听着是不是挺有意思?但真的走一遍你就会发现,这事费时费事还费脑子。软件测试有一个经典的环节,叫设计测试用例。什么意思呢?简单来说,你不是要花式折腾程序吗,花式虐狗还得先写一本《花式虐狗手册》呢,测试用例就是花式折腾程序的手册。
测试用例可不好设计,测试用例最希望的目标是做到路径全覆盖,也就是把程序所有可能的流程都测一遍。
这是非常烧脑的,光这么说可能感受不直观,接下来我们要讲游戏怎么进行软件测试,这里那就拿游戏作为例子好了,譬如说农药,现在要你设计一套路径全覆盖的测试用例,就是要你把所有角色的所有技能在所有可能的场景全都组合试一遍,就是这个难度,而且这还只是一小部分,因为农药除了竞技,还有社交、氪金等等别的各种功能,全都需要覆盖一遍。
现在应该可以看出来,软件测试并不简单,一套设计良好的测试用例,背后往往需要对软件的种种缺陷有深刻的认识。这就是为什么软工的书讲到软件测试,往往都会提出一个有点反直觉的观点:测试用例应该尽可能安排资深的专家来设计。
折腾软件听起来简单,写程序有门槛,测程序谁还不会对吧。但是,真要做到路径全覆盖,还真不是这么简单。随着软件规模越来越大,逻辑越来越复杂,传统的手工测试成本自然也随之暴涨,已经到了纯手工几乎不可能完成的地步。这个时候,软件测试人员想到了一个办法。
玩游戏感觉难度太高怎么办?开挂。那测试游戏也感觉难度太高怎么办?没错,同样也是开挂。软件测试人员开发出一种技术,叫自动化测试技术。当然了,虽然名字上叫“技术”,其实一开始也是测试人员零敲碎打甚至一拍脑门的产物。
根据《AI自动化测试》这本书的介绍,自动化测试技术的发展大致可分为四个阶段:
第一个阶段叫“录制-回放”技术,名字听起来好像很厉害,其实就是利用按键精灵或者之类的软件先记录键盘和鼠标的操作,然后不断重放进行测试。这套技术的优点很明显,简单易学,缺点也很明显,软件稍一改版,譬如稍微调整了一下某个按钮的位置,原先录制好的内容就完全作废了。
第二个阶段叫脚本化的自动化测试。脚本化意思就是要写脚本来测软件了,这应该是现在软件测试工作最常见的做法。不过和软件测试脚本和写软件一样,如果每次都从头开始,很快就会发现很多功能其实高度类似,大量时间都是在做重复性的工作。那怎么办呢?于是就有了第三个阶段。
第三个阶段叫测试框架。测试框架就是把测试脚本框架化,框架的好处不必多说了,在自动化测试中,框架也具有同样好处。有了测试框架,就可以把主要的时间精力,放在新增功能和核心功能的编写上面,能够显著提升了测试脚本的编写效率。
如果依据软件开发的经验,应该说自动化测试到了这个阶段,理论上就能难取得什么新突破了,实践上能做的工作主要就是对现有框架进行各种优化升级,或者开发新框架。那自动化测试的第四个阶段还能玩出什么新花样呢?答案就是真·自动化测试。
第四个阶段叫AI自动化测试。从自动化测试的前面三个阶段可以看出,虽然自动化测试名叫“自动化”,但实际上还是有许多工作需要人来完成,譬如说自动化测试的脚本就必须人来编写。
如果能够把这部分工作也“自动化”了,那岂不就是真正的自动化?想法很好,毕竟偷懒是IT技术发展的源动力,一样工作偷懒了,就样样工作都想偷懒。可是,可能吗?以前是不太可能,现在随着AI技术的进步,“不太可能”也随之变成了“也许可能”。
下面我们开始介绍如何基于AI技术对游戏类软件进行自动化测试。关于AI技术,我前面写过很多的文章,所以在开始之前,我想分享一个关于AI技术的观点。
技术的发展,尤其是计算机技术的发展,一定都是有一个不断发展成熟的过程,都是从一个“也许可能”开始,步履蹒跚跌跌撞撞,甚至可能会中途夭折,但都必须熬过这个艰难的过程,最终才能百炼成钢。
这几年AI技术很热,很多人已经着急地开始讨论用AI来取代人工,但在我看来,AI技术也并不例外,也需要经历那么一个跌跌撞撞的过程,选择了AI技术,并不意味着就选择了万事大吉,在通往应用的路上,还有大大小小无数的坑在等着勇敢的先驱们去填满。
现在的AI技术还正站在那个“也许可能”的起点上,更多地是告诉我们还有一种可能的选项。下面,我们就来一起看看,AI技术给游戏类软件测试带来怎样的可能选项。
说到游戏,行业内的同学第一个想到的应该都是最能“用心创造快乐”的腾讯互娱,有好几作爆款手游。最近腾讯互娱事业群的TuringLab实验室出了一本书,叫《AI自动化测试》,书里提到了一点不快乐的事。什么事不快乐呢?就是前面一直在说的软件测试。
手游也是软件,当然也需要进行软件测试,最常规的做法就是前面介绍的用自动化脚本测试。但编写测试现代手游的自动脚本,有三点难题:
第一点,版本迭代频繁。App时代,软件版本更新是家常便饭,这个我们都不陌生,但是对于测试人员来就简直是灾难了,每次更新自然都要调整脚本,有时甚至还做大幅度的改动,制造了大量的工作。
第二点,游戏本身就不太好测。游戏是一类特殊的软件,其中一个特点就是场景较多,而且具有一定的随机性,要通过脚本做到路径全覆盖尤为不易。
第三点,正式版本不带测试API。测试脚本依赖软件提供的测试接口才能完成各种测试动作,但正式版本肯定不可能提供测试API,这就导致了测试脚本无法正常工作。那怎么办呢?只好回到最原始的方式,用人工来测。
还有一点书里没提,但我觉得这应该也算是一大难题。腾讯互娱素来有“养蛊”的传统,同一类游戏题材,通常会选择让自家的多个制作团队同时独立开发竞品游戏,这一策略在市场上大获成功,但不难想象会给背后的测试团队带来多大的工作压力。
毕竟人无论多努力,时间和精力都是有瓶颈的,但机器没有,所以,腾讯互娱开始探索用AI技术来完成手游测试工作的自动化道路。
要实现真·自动化测试手游,首先需要解决三大问题。
第一个大问题是手游的“读写”问题,这是一切工作的基础。手游是安装在手机上的,必须得先找到一些方法能够对手机进行各种操作。
这个问题相对容易,Android操作系统就自带了调试工具,此外还有许多好用的第三方工具包,譬如OpenSTF发布的minicap和minitouch,基于ADB实现了对Android手机运行App的实时截屏和触屏操作,这就首先为自动化测试手游解决了“读写”问题。
第二个问题是“读”的问题。玩手游被亲切地称为“擦玻璃”,这是有原因的,游戏的画面呈现,和对游戏角色的操作,都是在同一块屏幕上进行的。
minicap虽然实现了截屏,但是哪一部分是画面,哪一部分又是操作呢?单就游戏画面来说,至少还能细分成两个部分,状态画面和奖励画面。这不是规范叫法,这里我是借用了强化学习的部分概念。
强化学习里有一个智能体(Agent)的概念,不妨理解成玩游戏时你操作的游戏角色,智能体要干什么呢?三件事,观察周围环境,采取一些行动,争取得到最高的奖励。
观察周围环境,术语叫做状态(State),譬如说竞速类游戏,当前是在形势在直路上,还是准备进入弯道。那奖励是什么呢?最容易能想到的就是游戏得分,不过,在一些游戏,譬如前面所举的竞速类游戏,还有一些其它的实时奖励,比如当前的车速等等。
强化学习就是通过观察状态,分析出当前应该采取什么行动(术语称为“策略”),从而获得最高奖励。这个过程称为策略优化。而要找到最优策略,必须将状态-行动-奖励以三元组的形式保存下来作为训练样本。这就要求必须首先从画面中获取状态画面和奖励画面。
对于这个问题,《AI自动化测试》介绍了如何使用基于深度学习的图像处理算法,来完成场景覆盖性测试和游戏场景图像物体识别。
▲强化学习使用的各个区域示意图,来源:《AI自动化测试》图3-8
第三个问题是操作的问题。解决了第二个问题,我们就获取了手游的各种信息,那接下来应该进行什么动作操作呢?这是软件测试最关键的问题,也是自动化测试最难解决的问题。对于这个问题,《AI自动化测试》给出了两种思路,第一种就是前面已经提到的强化学习,另一种名字就比较新鲜了,叫“模仿学习”。
什么叫模仿学习呢?很简单,就是现在争议非常大的“云通关”。模仿学习是这么玩游戏的,现在要我玩一款游戏,但我首先做的不是上手去玩,而是先到B站刷高手通关视频,一直刷一直刷,一直刷到我认为已经把所有细节都印入脑海了,我就开始凭着记忆去玩游戏。
可想而知的是,很多的操作我虽然不清楚是为什么,也就是很多人说的失掉了探索游戏的乐趣,但我多半能很快通关。这就是模仿学习想要达到的结果。
好了,前面大致介绍了游戏自动化测试所会遇到的问题,和《AI自动化测试》给出的解决思路,但读完你肯定感觉和我一样,就算这些方法真的对路,不过要一一从头实现实在太麻烦。
还记得我前面说的话吗,偷懒是IT技术发展的源动力,腾讯互娱显然也知道这个道理,已经推出了一款名叫GAME AI SDK的自动化测试平台,提供了许多已经封装好了的工具,来逐一解决前面提到的这些问题。
关于这部分内容,可以仔细阅读《AI自动化测试》这本书,GAME AI SDK正是本书的作者TuringLab团队的作品。
关于作者:莫凡,网名木羊同学,娱乐向机器学习解说选手,《机器学习算法的数学解析与Python实现》作者,前沿技术发展观潮者,擅长高冷技术的“白菜化”解说,微信公众号“睡前机器学习”,个人知乎号“木羊”。
延伸阅读《AI自动化测试》