Python游戏测试工具自动化遍历游戏中所有关卡

场景

游戏里有很多关卡(可能有几百个了),理论上每次发布到外网前都要遍历各关卡看看会不会有异常,上次就有玩家在打某个关卡时卡住不动了,如果每个关卡要人工遍历这样做会非常的耗时,所以考虑用自动化的方式来实现。

思路

游戏的战斗是有时间限制的,到了 5 分钟打不过就会判负,胜负都会出现结算面板,用 GA 提供的 find_element_wait 函数查找这个结算面板,从进入战斗到找到了这个面板 element 就是通关时间,如果超过 5 分钟了就说明被卡住了,最后输出一张” 关卡通关时间表 “排序看看哪些关卡通关时间>5 分钟即为有问题的关卡。

实现细节

1.卡住的判定和处理

GAutomator find_element_wait 函数的说明

代码中设置 5 秒查一次结算面板,超过 60 次其实已经卡住了 。Page.panel_BattleRes 是结算面板,这里采用 PO 模式把所有的 element 都写入到一个 Page 中。

如果卡住 了游戏会一直停在哪里,卡住后利用 adb 指令重启游戏并继续测试下一个关卡一直到遍历整个关卡列表。

2.GAutomator 调用游戏内部的 GM 指令

GAutomator 可以把游戏里的 C# 函数注册过来然后在 python 中调用,这是 GA 说明文档相关部分:

所以把游戏中的 GM 指令方法注册过去再在脚本里调用,这样我才能用指令进入各关卡而不会受到等级、入口、前置关卡等限制

unity 中:

python 中:

3.最终输出的报告

第一列是关卡 id,第二列是通关时间,100014 这个关卡是有问题的,因为已经超过 5 分钟了

详细代码

AutoBattleTest.py 用来实现核心逻辑

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

from testcase.tools import *

from testcase.ExcelTool import ExcelReader,ExcelWriter

from testcase.Page import Page

class AutoBattle:

    def __init__(self,level_excel_path):

        self.start_time=0

        self.levelList=ExcelReader(level_excel_path).read_first_sheet_first_col()

        self.excelWriter =  ExcelWriter()

        print(self.levelList)

    def start_battle(self):

        self.start_time=time.time()

        m_btnStartGame = engine.find_element(Page.btn_BeginFight)

        screen_shot_click(m_btnStartGame)

        #auto fight

        m_autoFight = engine.find_element(Page.btn_AutoFight)

        screen_shot_click(m_autoFight)

    def test_each_level(self):

        for index,level in enumerate(self.levelList):

            print("关卡id---->"+level)

            engine.call_registered_handler("GoTo", "n"+level) #这里调用unity里的GM指令

            self.start_battle()

            battleResult = find_element_wait(Page.panel_BattleRes, 65, 5)

            if (battleResult):

                screen_shot_click(battleResult)

                duration = str(int(time.time() - self.start_time))  # 关卡持续时间

                self.excelWriter.write_excel(index, 0, level)  # 第一列写关卡名

                self.excelWriter.write_excel(index, 1, duration)  # 第二列写通关时间

            else:

                duration = str(int(time.time() - self.start_time))  # 关卡持续时间

                self.excelWriter.write_excel(index, 0, level)  # 第一列写关卡名

                self.excelWriter.write_excel(index, 1, duration)  # 第二列写通关时间

                self.restart_game()

                self.default_login()

                find_element_wait(Page.btn_Battle)

        self.excelWriter.save_excel()

    def restart_game(self): #重启游戏

        os.system("adb shell am force-stop  %s"%Page.package_name)

        time.sleep(2)

        os.system("adb shell am start -n %s/.NativeUnityPlayerActivity"%Page.package_name)

    def default_login(self):#登录一次后续直接点击就可以登录

        #m_BtnSart2

        start_btn = find_element_wait(Page.btn_LogIn)

        screen_shot_click(start_btn)

if __name__ == "__main__":

    ab = AutoBattle("level.xls")

    ab.test_each_level()

ExcelTool.py 用来读写表格

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import xlrd

import time

import xlwt

class ExcelReader:

    def __init__(self,excel_path):

        self.excel_path = excel_path;

    def read_first_sheet_first_col(self):

        data = xlrd.open_workbook(self.excel_path)

        st = data.sheet_by_index(0)

        col  = [str(st.cell_value(i, 0)).replace(".0","") for i in range(0, st.nrows)]

        return col

class ExcelWriter:

    def __init__(self):

        self.wb = xlwt.Workbook()

        self.sh = self.wb.add_sheet("关卡通过时间记录")

        self.cur_col  =0

    def write_excel(self,row ,col,record_str):

        self.sh.write(row, col, record_str)

    def save_excel(self):

        date_string = time.strftime("%Y%m%d%H%M")

        excel_name ="TestResult"+date_string+".xls"

        self.wb.save(excel_name)

if __name__=="__main__":

    ew = ExcelWriter()

    ew.save_excel()

后记

这套脚本可以排查出一进入或者中途被卡住或者不结算被卡住的问题,但是如果是某个怪物的某个技能必定能导致关卡卡住,而这个怪物在放技能之前就被杀了,这种情况这套脚本有概率排查不到。

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言第十六集(后续)(结构体)

1.匿名结构体(即不写结构体名)只能用一次, 而且匿名结构体写法特别危险 两个匿名结构体尽管内容完全相同,但编译器仍然认为二位是不相同的类型 结构的特殊声明搜 2.结构体自己给自己里面包含一个结构体变量((此结构体就是当前所处的这个结构体))指针是没有问题的,但是 结构…

AI专题报告:2022年中国人工智能产业研究报告

今天分享的AI系列深度研究报告:《AI专题报告:2022年中国人工智能产业研究报告》。 (报告出品方:艾瑞咨询) 报告共计:112页 人工智能参与社会建设的千行百业 价值性、通用性、效率化为产业发展战略方向 …

淘宝API接口系列丨商品详情数据接口丨关键词搜索商品列表接口丨商品评论,销量接口

要对接淘宝API接口,可以按照以下步骤进行操作: 注册成为淘宝开放平台开发者,并创建一个应用。在应用创建页面,需要填写应用的名称、描述等信息,并设置应用的API权限等级。获取App Key和App Secret。在应用创建后&…

淘宝商品详情:获取海量优质商品信息

淘宝商品详情接口,也称为淘宝商品详情API,是一个用于获取淘宝商品详情的接口。它可以帮助开发者快速获取淘宝商品信息,从而构建自己的电商应用程序。 在开始使用淘宝商品详情接口之前,首先需要了解以下几个概念和步骤&#xff1a…

jira创建用例,与任务关联

项目用的jira,但之前的用例放在禅道上,或者归档于svn,都不是很好用,所以研究了下jira的用法 1、下载插件: synapseRT - Test management and QA in JIRA 完成后在tab会多出一个test 2、常用的功能 1、建立用例&#…

【华为OD题库-081】最长的元音子串长度-Java

题目 题目描述: 定义当一个字符串只有元音字母一(a,e,i,o,u,A,E,l,O,U)组成, 称为元音字符串,现给定一个字符串,请找出其中最长的元音字符串,并返回其长度,如果找不到请返回0, 字符串中任意一个连续字符组成…

Gitlab+GitlabRunner搭建CICD自动化流水线将应用部署上Kubernetes

文章目录 安装Gitlab服务器准备安装版本安装依赖和暴露端口安装Gitlab修改Gitlab配置文件访问Gitlab 安装Gitlab Runner服务器准备安装版本安装依赖安装Gitlab Runner安装打包工具安装docker安装java17安装maven 注册Gitlab Runner 搭建自动化部署准备SpringBoot项目添加一个Co…

验证码的多种生成策略

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 第一种 a.导入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</ver…

【数据结构】字典树(Trie树)算法总结

知识概览 Trie&#xff1a;高效地存储和查找字符串集合的数据结构数字、汉字可以用二进制位来存 例题展示 题目链接 Trie字符串统计&#xff1a; https://www.acwing.com/problem/content/837/ 代码 #include <cstdio>const int N 100010;int son[N][26], cnt[N],…

zxjy003- Spring Cloud后端工程搭建

1、创建 sprigboot 工程 guli-parent groupId &#xff1a; com.atguigu artifactId &#xff1a; guli-parent 2.删除src目录 3.配置pom.xml 修改版本为 &#xff1a;2.2.1.RELEASE<artifactId> 节点后面添加 pom类型 全部依赖&#xff0c;复制下面的即可&#xff0c…

素材创作平台,解决企业素材供给问题

企业对于高质量素材的需求日益增长。无论是为了提升品牌形象&#xff0c;还是为了推动产品销售&#xff0c;都需要大量的专业设计素材。然而&#xff0c;素材的获取、设计和定制往往是一项耗时耗力的工作。这时&#xff0c;美摄科技素材创作平台应运而生&#xff0c;为企业提供…

LeetCode [中等]矩阵置零

73. 矩阵置零 - 力扣&#xff08;LeetCode&#xff09; 暴力解法 用两个标记数组分别记录每一行和每一列是否有零出现。 遍历该数组一次&#xff0c;如果某个元素为 0&#xff0c;那么就将该元素所在的行和列所对应标记数组的位置置为 true。再次遍历该数组&#xff0c;用标…

从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能

ScreenCap---Version&#xff1a;001 说明 从0到1&#xff0c;手把手带你开发windows端的截屏软件ScreenCap 当前版本&#xff1a;ScreenCap---001 支持全屏截图 支持鼠标拖动截图区域 支持拖拽截图 支持保存全屏截图 支持另存截图到其他位置 GitHub 仓库master下的Scr…

人工智能技术在数据治理中的一些思考

随着企业信息化系统的快速建设&#xff0c;以及物联网的规模化的应用&#xff0c;企业数据规模快速增长&#xff0c;与之同时企业数据的治理模式仍然以传统的治理方式为主&#xff0c;ChatGPT等人工智能的崛起正深刻改变着数据治理的思路&#xff0c;如何将AI技术引入企业数据治…

C++新经典模板与泛型编程:用成员函数重载实现std::is_convertible

用成员函数重载实现is_convertible C标准库中提供的可变参类模板std::is_convertible&#xff0c;这个类模板的主要能力是判断能否从某个类型隐式地转换到另一个类型&#xff0c;返回的是一个布尔值true或false。例如&#xff0c;一般的从int转换成float或从float转换成int&am…

使用Plex结合cpolar搭建本地私人媒体站并实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

剧本杀小程序搭建:打造线上剧本杀新体验

剧本杀是一款以角色扮演为主的游戏&#xff0c;一度成为了年轻人的最喜爱的社交游戏。在剧本杀市场需求下&#xff0c;剧本杀规模也迅速上升。今年第一季度&#xff0c;剧本杀市场规模环比增长47%&#xff0c;市场整体消费水平逐渐呈上升趋势。 随着剧本杀的不断发展&#xff…

echarts绘制一个环形图2

其他echarts&#xff1a; echarts绘制一个环形图 echarts绘制一个柱状图&#xff0c;柱状折线图 echarts绘制一个饼图 效果&#xff1a; 组件代码&#xff1a; <template><div class"wrapper"><div ref"doughnutChart2" id"dough…

ORACLE数据库实验总集 实验六 SQL 语句应用

一、 实验目的 &#xff08;1&#xff09; 掌握数据的插入&#xff08;INSERT&#xff09;、 修改&#xff08;UPDATE&#xff09; 和删除&#xff08;DELETE&#xff09; 操作。 &#xff08;2&#xff09; 掌握不同类型的数据查询&#xff08;SELECT&#xff09; 操作。 二、…

阿里滴滴之后,腾讯视频也崩了!网友追问:下一个是谁?

继滴滴“崩了”一夜后&#xff0c;刚过去不到一周时间&#xff0c;互联网“崩了”连续剧又迎来了续集。 就在刚刚&#xff0c;也是晚间时分&#xff0c;网友曝出腾讯视频崩了&#xff0c;不能追剧了。接着&#xff0c;腾讯视频官方便现身回应&#xff0c;坐实了传闻。 还是同…