一场竞技游戏,我们在这里稍微划分一下,将其分为局外界面和局内战斗。举个例子,比如LOL,在大厅、组队、选英雄界面这些都是局外界面。当我们等待读完长长的进度条,进入到游戏,听到"咚咚咚咚咚"的声音后英雄出现到我们眼前,这个时候,你就已经到了局内战斗的部分里了,也就是我们今天要讨论的内容。

1. 概述

本文主要对局内战斗的自动化测试进行讲解。包含如何实现战斗自动化的流程和脚本运行本身框架进行介绍,读者应具备一些python的编程经验和UI自动化的开发经验。

对于游戏的UI自动化这里采用poco的unitysdk形式进行实现。稍微介绍一下poco。这是一个类似appium的客户端UI自动化框架,利用界面元素来进行UI自动化操作。

官方文档:
https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/integration.html

元素来源于UITree,UITree源于接入unitysdk的游戏客户端。通过与外部挂载agent进行socket通信,从而将使用unity引擎游戏的UITree返回给外部供自动化相关。

UITree里面包含对应Tree中元素的所有属性信息,其中包含元素的position属性(位置信息),这也是我们得以锁定对应元素进行操作的核心依据。

通过pocosdk获取游戏客户端UI层信息,对UI信息中的具体内容做对应处理。

最后反馈对应数据给AI,由AI进行对应决策,将决策信息返回给本地后执行对应的UI自动化操作代码,从而完成决策,通过大量决策的实施,完成整局的实时操作。

再引入多轮重开检测机制,进而完成局内战斗的自动化对战。

一些简单的演示:

在unity项目中,需要在unity中安装Poco的SDK

Poco调用方法


import time
from poco.drivers.unity3d import  UnityPocopoco = UnityPoco()poco('btn_start').click()
time.sleep(1.5)shell = poco('shell').focus('center')
for star in poco('star'):star.drag_to(shell)
time.sleep(1)assert poco('scoreVal').get_text() == "100","score correct."
poco('btn_back',type = 'Button').click()## Poco调用举例poco = UnityPoco()    #1、通过接口调用unity中的pocosdk,SDK对整个ui树进行遍历,将dump后的json信息传出以供调用。poco('btn_start').click()    #2、在得到的UI树中找到‘btn_start’的元素位置信息,通过adb进行点击操作。

2. 具体流程

流程描述:

通过每次对当前UI数据的检查,判断其在局内还是局外。局外会进入到局内对局,处于局内则会检测当前局内状态,将当前的局内UI信息做整合,提取指定信息发送给AI决策服务,再根据AI的返回来进行对应的UI自动化代码操作。

3. 实现过程

3.1 UI层数据获取
使用poco.freeze,利用里面的agent dump把当前的UI树保存下来(因为要用到root节点,root节点下的内容无法用children获取)。

其他的数据使用poco.freeze调用正常的poco方法进行提取即可。

3.2 指定数据提取
确认好AI一共需要我们提供哪些数据,这些数据能不能从游戏的UI信息中读取出来。确认好后,我们就可以开始进行对应项的提取了。

要注意提取的UI元素是不是在特定UI中才会有,他能不能被容易的获取,也就是对提取指定信息的难易度和是否需要条件构建进行判断。

以自走棋游戏举例,对于棋子的提取会复杂一些,因为没有对应棋盘上每个格子的坐标,只有放在根目录下的美术资源。这部分的数据一个是需要存起来自己写方法提取,一个是要根据里面属性包含的信息判断其在场上还是在手牌。

目前这一部分的判断经历过三个阶段:

靠pos属性判断。

靠对pocosdk接入unity的c++源码进行修改添加的rawpos属性进行判断。

靠这两者综合判断,保证不会有判断错的情况出现 。

3.3 数据接口请求过程
请求数据示范样本:

{“round_drawscount”: 0,
“round_actionscount”:2,
“round”:17,“level”:6,
“experience”:2,
“money”:33,
“blood”:73,}

也就是包含一些基本玩家信息的json数据。

AI接口返回数据:

{‘eventId’: ACTION_UPGRADE}{‘eventId’: ACTION_DRAW}{‘eventId’: ACTION_PICK,‘params’: {‘draw_cardIndex’: 0}}{‘eventId’: ACTION_DROP,‘params’: {“hand_cardIndex”:0}}{‘eventId’: ACTION_SWAP, ‘params’:{“hand_cardIndex”:0,“play_listIndex”:1}}{‘eventId’: ACTION_SWAP, ‘params’:{“hand_cardIndex”:2,“play_listIndex”:1}}{‘eventId’: ACTION_SWAP, ‘params’:{“hand_cardIndex”:0,“play_listIndex”:2}}

大致是一些游戏AI的决策内容,通过不同的事件ID告知你应该做什么样的事情。这里是以网页游戏排行榜的自走棋游戏为例进行展示。

具体返回内容就根据实际的业务需求去制定了。

接口须知:

所有发送的参数需要向开发人员确认。

会存在后期的变动维护,例如传参要求和增删参数。

要注意发送的数据是经过处理为标准格式。

3.4 返回决策实施
决策实施这里以自走棋类游戏的操作为例:

刷棋盘:保证商店处于打开状态后刷新。

买棋子:保证商店处于打开后购买对应索引位置棋子。

升人口:随时都会有的按钮,直接用点就可以。

上下交换棋子:根据对应index有无棋子来判断对应上下棋子的决定。

卖棋子:点击对应index位置,再点击sell按钮。

#对应返回eventID执行不同操作eventid = self.reqs_data["eventId"]if eventid == 0:self.round_over([])elif eventid == 1:self.read_chessbook()elif eventid == 2:self.refresh()elif eventid == 3:self.buy_chess(self.reqs_data["params"]["draw_cardIndex"])elif eventid == 4:self.sell_chess(self.reqs_data["params"]["hand_cardIndex"])elif eventid == 5:self.up_down_change(self.reqs_data["params"])

3.5 脚本运行框架介绍

其实这个框架归类的比较简单,就四个大块:

(1)runner:包含触发检测的触发器,用于传入指定包名,选择对应服务器等操作进行持续集成相关操作;包含动作调用,用来执行对应返回值的操作;包含日志记录,记录过程中的游戏运行日志和adb日志等;包含屏幕录制,记录游戏过程中的运行视频,提交视频数据给UI检测接口判断有无UI异常出现(多为花屏白屏和其他明显UI异常情况)。

(2)datas:游戏运行数据的记录文件,包含日志的存放和游戏对应战斗结果的存放(例如当前回合,本局战斗的排名胜负)。

(3)common_cls:一些公共模块,包含与AI的通信,数据的发送和返回;包含UI的通用操作,如自动安装对应版本游戏客户端后启动游戏,过关新手引导,生成新账号等操作;包含通过对AI决策调用对应UI操作方法的函数,也就是动作函数。

(4)requirements:整个工程是通过python完成的,这个就是帮你一键安装所有所需库的文件,其中涉及到了一些对poco框架的二次开发,需要本地修改后使用。

大致的runner流程:

确保你的设备已与电脑开通调试连接,再启动poco与adb的本地通信,对当前UI进行判断是否在局内,局内走提取指定信息,发送给ai进行决策,再执行AI的决策。通过每次检测有无战斗结束进行重开实现多轮流程,runner的流程图与具体实现流程图基本一致。

3.6 相关优化问题
**关于黑名单:**比较大型的网页游戏,局内战斗的元素和UI的复杂程度也是很高的,保存一次UI树的信息也有2M以上的数据,而获取时间会随着UI复杂度的上升而上升。从最终效果来看,战斗从前期到后期,获取时间会由1秒到4秒逐渐上升,这样的速度是不能满足实现业务需求的,因此建议从poco的unitySDK上添加黑名单机制,以提高获取UITree的效率。

**建议利用freeze函数:**多次提取会重复的获取UI元素浪费时间,目前已经解决这个问题可以只获取一次就提取出所有参数。目前较大型游戏因局内战斗UI结构复杂,获取一次UI信息在一秒到三秒内不等。

**UI层操作时间问题:**需要避的坑有两个 (1)minicap截图:这个要关掉,实际会采用录屏行为,不需要截图。截图服务启动会消耗时间且截图本身也消耗性能 (2)adb本地socket通信建立:确保一次建立,这是poco click swipe等方式进行指令的必要条件,需要提前自己启动起来,让他们时刻保持通信,这样会大大降低单次操作时间。现在单次实行操作的时间已经可以控制在最快0.2秒最慢0.8秒。

**获取UITree时间问题:**通过观察发现,UITree的获取时间跟界面的复杂程度是正相关的。一个比较简单的局外界面可以在0.5秒内就获取完毕,而较为复杂的局内战斗就要约2秒多的时间。对于实际操作而言,这样的过程都太长了。目前探索出的解决方法有两个:(1)利用黑名单,(2)只dump一次,更新后的数据不做重新获取,而是采用利用预期结果的数据本地维护。

有关poco的c++层sdk修改文章请尝试自行百度…

3.7 注意事项
(1)获取一次UI信息的时间会随着UI复杂度的提升而提升,局内较为复杂,到后期尤甚。通常在两秒多三秒左右,实际使用要根据项目做具体优化。

(2)处理获取出的原始数据到提取对应数据会用到0.2秒左右时间。

(3)操作间要保证存在足够时间间隔,一个是利于等待操作后UI确实刷新,一个是保证UI切换展示出内容需要时间 。

(4)双击功能需要观察能不能实现现有客户端的操作(adb和poco double click都不行),有的客户端要求双击的两次点击时间间隔太短,不一定能通过自动化实现。

4. 结论

本文主要描述了通过局内调用AI的方式实现自动打游戏。利用这个框架可以进行局内的多轮流程检测(甚至上分),从而帮助测试同学免去重复去测局内战斗的皮肉之苦,同时可以记录过程视频,交由AI或其他api判断有无花屏白屏的情况,adb报错,unity报错信息都可以进行实时收集,接下来我们也会对局外的AI探索性遍历展开研究,请大家持续关注我们,并指出我们的不足。

游戏自动化测试-局内战斗相关推荐

  1. 游戏自动化测试——局内战斗

    利用AI,使用正常的玩家客户端来打游戏是一种怎样的体验? 直接人都不用玩游戏了,放那,让AI帮你玩,过一会就看到自己分上去了.多爽,请代练的钱都省了,妥妥的.然而,我们今天是来讨论正经的技术问题.如何 ...

  2. 游戏自动化测试好文分享

    [游戏测试专题]游戏自动化测试指南-产品保障框架细致入微 这里无图片,请跳转看原文 原文:游戏自动化测试指南 所谓自动化测试,就是模拟手工测试步骤,通过执行程序语言编制的测试脚本自动地测试软件产品,自 ...

  3. 【Game Of AutoTest】4、游戏自动化测试的稳定性保障

    在游戏自动化测试技术落地过程当中,如何保证自动化测试的稳定性,是一个需要重点优先解决的困难问题. 以手机游戏客户端自动化测试为例,和一般服务架构的自动化单元测试或集成测试不同,自动化驱动的过程,其本质 ...

  4. 游戏自动化测试工具GAutomator上手

    记录该博客主的一些见解,以便日后自己触及踩坑,附原文地址 [测试人生]游戏自动化测试工具GAutomator上手 | HiKariのTechLab 最近开始研究一些游戏自动化测试方面的内容.游戏自动化 ...

  5. html5游戏自动化测试,胡侃游戏自动化测试

    arduino入门_使用Arduino入门包进行测试和修补 arduino入门 您是Arduino新手吗? 像Adafruit的Arduino Starter Pack这样的开放式硬件是开始修改这种小 ...

  6. 微信小程序和小游戏自动化测试

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 此文章来源于项目官方公众号:"AirtestProject" Airtest Project自动化测试方案除了支 ...

  7. 计算机游戏自动化测试软件,Airtest IDE

    Airtest IDE电脑版是一款专业的UI自动化测试工具.软件提供自动化脚本录制.一键回放.报告查看等功能,用户可以轻而易举实现自动化测试流程.软件支持基于图像识别的的 Airtest 框架,用户只 ...

  8. 读《游戏自动化测试实践》

    陈大卫,李建玲 著 电子工业出版社 书的内容多少有些问题,比如代码解决的一般(注释),但代码量不少. 比如介绍的软件使用的内容不多.不够细.逻辑差了点.等 但就测试内容来说,还是本不错的书. 一,游戏 ...

  9. ubuntu自带游戏_腾讯IEG开源GAME AI SDK:自动化测试吃鸡、MOBA类游戏

    近日,腾讯互娱(IEG)开源了一款名为 GAME AI SDK 的自动化测试平台,该平台封装好了多种工具供开发者使用,目前支持的游戏类型有跑酷类.吃鸡类.射击类.MOBA 类等. 项目地址:https ...

最新文章

  1. 最大识车数据集:6.4万张车型参数完整标注,交通安防二手都能用
  2. 警方建立了一个人工智能来预测暴力犯罪,它有严重缺陷
  3. WIN32 多线程吃字母练习
  4. Samba的简介和配置
  5. 数据结构(5) -- 图
  6. SAP Fiori Elements 应用 manifest.json 文件里 resources.json 的含义
  7. MFC控件(7):Split Button
  8. 空间插值方法对比整理
  9. Oracle结构组成
  10. 【机器学习-西瓜书】九、聚类:性能度量;距离计算
  11. yaml和properties文件相互转换的网站
  12. 电脑集成显卡莫名消失与重新恢复的过程,以华硕Z97-K主板为例说明
  13. 字节跳动实习生转正工资_字节跳动西瓜视频招聘 | 新媒体运营实习生
  14. 自定义皮肤,你值得拥有!
  15. 使用pyinstaller打包.py文件生成.exe文件
  16. 2023浙江工商大学计算机考研信息汇总
  17. STM32-MIDI音乐播放程序
  18. dos的cd命令输入cd d: 怎么不能切换到D盘了?
  19. Android界面尺寸规范
  20. 郑大计算机专业多少分,2020年,郑大各专业分数线公布,里面门道很多,给你们一一分析...

热门文章

  1. TI CCS CMD连接器命令文件说明
  2. List集合的交集(retainAll)、并集(removeAll,addAll)、差集(removeAll)
  3. opencv实例之检测试卷填空位置
  4. java设置表格第一列长度_java 画pdf用itext调整表格宽度、自定义各个列宽的方法...
  5. gcc/g++/clang/cl编译器
  6. Arm Mali GPU最佳实践(Arm Mali GPU Best Practices)
  7. JavaEE 企业级分布式高级架构师(十三)微服务框架 SpringCloud (H 版)(1)
  8. oppo手机使用应用沙盒动态修改电池参数
  9. 城市建筑Shp转stl模型文件说明
  10. 洛谷P1765 手机