关闭

高效、易用的自动化测试框架设计

发表于:2023-7-11 09:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:张鑫    来源:知乎

  在自动化测试工作中,有两个痛点一直困扰着很多团队:
  1. 每次测试都要专人重新编辑脚本,内容重复造轮子,费时费力,甚至不如人工测试方便;
  2. 提前写好多个不同功能的脚本,编辑风格导致脚本间差异巨大;大量调试修改降低了脚本复用性,脚本维护困难重重。
  如果将各类脚本中大量重复性内容固定下来,用统一的标准来规范脚本的编辑,那么团队只需要花费少量时间精力,依据任务需求修改少量的内容,就可以快速复用脚本,迅速开展自动化测试。这就是自动化测试框架能完成的事情:
  ·代码复用率高
  · 标准规范,维护方便
  · 用例全面,使用灵活、便捷
  广州天纵的测开团队很早就注意到了这点,他们在自动化测试框架的设计和使用上积累了丰富经验。接下来我们就一起和大家分享下天纵团队使用UWA Pipeline实现自动化测试框架的设计经验。
  自动化测试框架
  天纵团队通过设计这套自动化测试框架,在每次开展测试任务时,都能根据需求,灵活配置对应的测试用例,将游戏内复杂的GM操作简单化,实现了UI按钮的截图生成与配置。这些都极大地方便了自动化测试工作的开展。
  1. 执行步骤的切分与组合
  1.1 拆到不同的脚本中
  在框架中,使用动态导入所有的用例文件,通过动态model对象去调用用例中的指定函数来执行对应用例,例如model.Run(),代码逻辑写在run()里面。
  #用os库,获取用例文件下所有用例返回列表list
  #遍历列表,使用importlib库,动态导入所有模块
  import os, importlib
  list = os.listdir('./示例/用例')
  for case in list:
      mod = importlib.import_module(f'示例.用例.{case}')
      mod.run()
  由此就将项目的测试内容拆分为一个个小的模块,在选择执行用例时,就可以进行灵活的拼接组合。
  1.2 按照ID与分类进行划分
  一般项目的新手流程中任务会很多,而且更改也很频繁,如果不对任务做一个分类,直接上代码,那么当有某个任务流程有调整时,后面可能全部都要跟着调整,导致消耗大量的人力和时间。
  因此,天纵团队对任务做了分类,每类任务对应1个任务ID。例如对话任务的任务ID为1,那就写一个方法task1(),对话任务的流程就写在task1()里面。多个对话任务,都是调用task1()方法,以后,不管对话任务有新增或减少,都不需要改代码,若是流程有改变,只需要改task1()里面的逻辑。
  2. 通过RPC调用客户端接口
  在Unity集成的Poco SDK中,客户端程序人员增加了“接收Python通过Poco发出的消息”的功能,然后可以根据接收到的不同消息内容去执行对应的功能。
  目前已实现的功能有“返回游戏中Lua的配置表数据”、“打开指定界面”,以及上图的“调用GM命令”,原本需要人工打开GM界面手动进行配置的各种GM调试工作,现在在自动化测试过程中直接代码调用就能完成。
  在此天纵团队提醒大家:对于用Poco去读取Lua配置获得数据的操作,尽量放在游戏任务流程前,或者说放在开始收集性能数据前。因为Poco读表会带来一定的性能开销,大家需要避免这个开销对游戏性能分析的影响。
  3. 按钮的配置
  自动化测试中,各类按钮的点击,是相当普遍和频繁的。天纵在框架中维护了两套按钮的点击方式,分别是“图片”和“字符串”,前者通过Airtest的图像识别进行按钮定位和点击,后者通过Poco的UI层级信息执行点击。
  但随着项目迭代,UI的改动会很大,图片资源会被替换,UI元素名字也会更改,导致脚本也要频繁修改。为了解决这个痛点,于是在框架中将数据分离,把按钮按照名称进行索引,把索引关系保存在配置表里面,在执行用例时,从表格中获取按钮来执行点击。
  对于通过Poco的UI层级信息执行点击的方案,提醒大家在游戏开发前期就要同步好结构,把按钮的name写在配置表里,客户端程序人员通过读取按钮的name生成UI树,这样就能通过读取配置表来生成Poco的配置。
  而对于通过Airtest的图像识别进行点击的方式,主要是考虑到低端机,用图片可提高框架兼容性。
  4. 测试异常自动通知
  为了应对大批量设备进行自动化测试且没有人员在现场值守的情况,天纵团队实现了测试情况的自动同步:在脚本报错后捕获异常,将相关的截图和报错信息等,自动地通过沟通工具实时发送消息到群里提醒对应成员,方便大家及时同步消息和进行处理。
  这里可以根据大家日常办公的沟通工具进行选择,比如企业微信、飞书等,简单一点也可以用发邮件的方式。以飞书为例,先建个群,加入飞书机器人,建群完成后,获取webhook地址。
  import json, requests
  # webhook地址
  url = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxx"
  payload_message = {
      "msg_type": "text",
      "content": {
          "text": "你要发送的消息"
      }
  }
  headers = {
      'Content-Type': 'application/json'
  }
  response = requests.request("POST", url, headers=headers, data=json.dumps(payload_message))
  通过这样的方式,大家对异常情况能够进行及时的记录和干预,方便后续处理相应的问题。
  5. 在UWA Pipeline上运行
  天纵团队将自动化测试工程打成zip包后,可以在UWA Pipeline上正常运行。在UWA Pipeline中创建定时任务,结合UWA Pipeline提供的云真机系统,完成日常的自动化测试。
  这里有个细节需要注意:自动测试代码中涉及到路径的功能,在上传到UWA Pipeline中运行时可能会出现异常。比如,通过相对或绝对路径获取的文件无法找到,运行报错。这里有两个方案:一个是通过os库提供的功能获取当前脚本的路径,从而确定当前运行的Workspace,进而拼接出其他文件的绝对路径,获取路径的代码,如:os.path.dirname(file);另一个方案是,通过相对路径查询文件,这需要将当前的Workspace路径添加到环境变量的PATH变量中。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号