经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
python游戏测试工具自动化遍历游戏中所有关卡
来源:jb51  时间:2022/6/21 12:20:38  对本文有异议

场景

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

思路

游戏的战斗是有时间限制的,到了 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. from testcase.tools import *
  2. from testcase.ExcelTool import ExcelReader,ExcelWriter
  3. from testcase.Page import Page
  4. class AutoBattle:
  5. def __init__(self,level_excel_path):
  6. self.start_time=0
  7. self.levelList=ExcelReader(level_excel_path).read_first_sheet_first_col()
  8. self.excelWriter = ExcelWriter()
  9. print(self.levelList)
  10. def start_battle(self):
  11. self.start_time=time.time()
  12. m_btnStartGame = engine.find_element(Page.btn_BeginFight)
  13. screen_shot_click(m_btnStartGame)
  14. #auto fight
  15. m_autoFight = engine.find_element(Page.btn_AutoFight)
  16. screen_shot_click(m_autoFight)
  17. def test_each_level(self):
  18. for index,level in enumerate(self.levelList):
  19. print("关卡id---->"+level)
  20. engine.call_registered_handler("GoTo", "n"+level) #这里调用unity里的GM指令
  21. self.start_battle()
  22. battleResult = find_element_wait(Page.panel_BattleRes, 65, 5)
  23. if (battleResult):
  24. screen_shot_click(battleResult)
  25. duration = str(int(time.time() - self.start_time)) # 关卡持续时间
  26. self.excelWriter.write_excel(index, 0, level) # 第一列写关卡名
  27. self.excelWriter.write_excel(index, 1, duration) # 第二列写通关时间
  28. else:
  29. duration = str(int(time.time() - self.start_time)) # 关卡持续时间
  30. self.excelWriter.write_excel(index, 0, level) # 第一列写关卡名
  31. self.excelWriter.write_excel(index, 1, duration) # 第二列写通关时间
  32. self.restart_game()
  33. self.default_login()
  34. find_element_wait(Page.btn_Battle)
  35. self.excelWriter.save_excel()
  36. def restart_game(self): #重启游戏
  37. os.system("adb shell am force-stop %s"%Page.package_name)
  38. time.sleep(2)
  39. os.system("adb shell am start -n %s/.NativeUnityPlayerActivity"%Page.package_name)
  40. def default_login(self):#登录一次后续直接点击就可以登录
  41. #m_BtnSart2
  42. start_btn = find_element_wait(Page.btn_LogIn)
  43. screen_shot_click(start_btn)
  44. if __name__ == "__main__":
  45. ab = AutoBattle("level.xls")
  46. ab.test_each_level()

ExcelTool.py 用来读写表格

  1. import xlrd
  2. import time
  3. import xlwt
  4. class ExcelReader:
  5. def __init__(self,excel_path):
  6. self.excel_path = excel_path;
  7. def read_first_sheet_first_col(self):
  8. data = xlrd.open_workbook(self.excel_path)
  9. st = data.sheet_by_index(0)
  10. col = [str(st.cell_value(i, 0)).replace(".0","") for i in range(0, st.nrows)]
  11. return col
  12. class ExcelWriter:
  13. def __init__(self):
  14. self.wb = xlwt.Workbook()
  15. self.sh = self.wb.add_sheet("关卡通过时间记录")
  16. self.cur_col =0
  17. def write_excel(self,row ,col,record_str):
  18. self.sh.write(row, col, record_str)
  19. def save_excel(self):
  20. date_string = time.strftime("%Y%m%d%H%M")
  21. excel_name ="TestResult"+date_string+".xls"
  22. self.wb.save(excel_name)
  23. if __name__=="__main__":
  24. ew = ExcelWriter()
  25. ew.save_excel()

后记

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

以上就是python游戏测试工具自动化遍历游戏中所有关卡的详细内容,更多关于python游戏测试自动化遍历关卡的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号