游戏测试 游戏自动化类型和方向

陈子昂 · 2020年11月06日 · 1713 次阅读

#### 话题
来自看到 UI 自动化觉得无用,但是网络层不知道怎么写,只会抓包。这里来谈谈目前见到和实现和写过 Demo 的游戏自动化类型。
先从驱动测试套件方式和快速编写 纬度来谈谈,里面部分内容可能存在烂大街,但是尽量把一些技巧给写出来。

驱动测试套件方式

测试套件就是你要执行的测试用例方式,大体如下。
1.单元测试框架驱动测试 case 目录。
2.消息队列驱动 case 目录。
"小茅屋"流程图如下。
执行单位 (线程/进程)==>adb 驱动手机 ==>桥接==>电脑程序 ==>find 测试执行路径==>bind 手机序列号(占用)==>开始执行 testsutie.

根据业务收集,主流是第一种,第一种优点是框架本身提供了一些完备功能(驱动执行,决定执行顺序,条件表达式可以跳过,统计测试结果,配合文件提供报告等)
如果 Python 栈的话,pytest 和 unittest,都是重约定,差异是前者是以装饰器为主的插件流派,里面 case 不用遵守 ascii 命名规则,后者提供了(静态和动态)重排测试用例执行功能。

动态重排模式如下:
文件 1:case 排列.py(依赖字符串模板和配置描述文件生成)一开始只有默认带 pass 空函数,但是会引用测试用例模块下面的init.py,这个里面会提前导入所有测试套件类。
init.py 里面内容会导入到文件 1.
文件 2:前置设置等行为.py(用于负责自动化 case 前置步骤和一些前置步骤检查包的组件,这个回头在其他文章自动化组件内会提到)
文件 3:main.py(能短就短) main 文件内初始,引用了文件 1 和文件 2.里面第一行写字符串模板和配置描述文件生成的方法调用,填充文件 1 成功后。
文件内部内容顺序 1.文件 1 填充方法 2.文件 2 调用.3.文件 1 方法驱动。
缺点:
1.一旦断线和异常断开只能重新跑。
2.如果混合单测框架进行开发,一些继承自研方法类无法被继承。
3.不使用全局的,驱动下个文件会被覆盖。

消息队列模式和前者差异最大为前者要有类对象,消息队列反而不推荐有,当然有也可以。
优点:
可以断开续传,只需要记录当前一批生产者函数信息,下次从最近一次应该执行函数开始走起。

消息队列模式,细分为 2 类,一个是引用数据类型的消息队列,一个是 mq 的消息队列。
推荐使用 mq 的消息队列(rabbitmq),自己写的消息队列加了很多功能也比较简陋,这个我头铁试验过已踩坑。
链接队列实体,生产者定义一个队列名(消费者用同一个),生产者批量传输按测试用例模块划分的用例函数插入,消费端进行接收后可以确认后执行。
自动化要做阻塞模式,接口部分场景用非阻塞模式。

需要预防出现消息重发,可以引用一套数据结构,这个数据结构并且可以作用到单测框架使用中去。
{"project":"xxxxGame","data":{"case1":{"status":"pass","err_code":"自定义\n----------\n 加堆栈信息","pic":"视频拆出的动图/错误截图"}}}
每个 case 都是 key,case 就是函数对象名称,每次接过去更新映射 map 对象。

快速编写

1.可视化编辑
一些带 IDE 和启动端开源具备的,佼佼者比如 Airtest,企业版是企业版的 IDE,似乎功能更多,没用过。
这种使用可视化编辑和 OCR 结合实现自动化,最终也可以输出报告。
目前业内也有一批公司在用,但不如写成项目更灵活支持更多功能。

2.回放
这个我只做了预研了 Demo,实现细节不公开。
本质就是把跑一次把二进制报文记录下来,然后退出游戏,重播。其实接口测试如果在跑,其他用户是可以看到你这个角色在线的,如果是 3D 可见周围玩家,如果你还在跑,也见的。
缺点:
一些来回窗口事件的丢失,回放时会先出现断流和快速补帧,人物行动在其他人那边看来很诡异,但依然会造成伤害。
由于是录制协议回放的自动化,无报告,如果要实现测试报告,需要做插桩处理。
同上原因,因为无渲染关系,可能会穿墙并且没法收集性能,也不是说不能回放时采集,根据缺点第一条,这样采集数据和实际完全不准啊。
总结:目前来看尚缺大量构造(时间序列存储数据,解构客户端一些计算,人物属性关系绑定等等)和不成熟,和游戏类型更多关系,比如位置同步的,就会缺失更多。

提高维护性的脚本框架

这里不谈平台,那个只是为了执行后统一化展示和收拢数据。脚本框架的分层和其描述文件分层是提高可维护性,多处文件但文件名字清晰和对称也是好维护的。
分层位置:
场景测试用例:功能测试用例在写自动化时,需要做到和自动一起调整顺序,这里是按场景划分,跑完的 case 会在最后一起填入。
场景操作方法封装:用到具体 Case 里面。
场景同名的描述文件:标记当前场景的常量和一些可变更的,这里如果会配置中心,可以丢配置中心上面修改,减少文件数量。
修改时就按场景"解耦"修改,主要是容易找。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册