Airtest跨平台的UI自动化测试框架

发表于:2020-6-18 11:03

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

 作者:songzhidong    来源:搜狗测试

  一、什么是Airtest
  Airtest是网易出品的一款基于图像识别和poco控件识别的UI自动化测试工具。支持WindowsAndroid、IOS平台。
  Airtest提供了跨平台的API,包括安装应用、模拟输入、断言等。可结合python脚本进行自动化。测试脚本运行后可以自动生成详细的HTML测试报告。
  二、Airtest环境部署
  ① 官网地址:http://airtest.netease.com/;
  ② Airtest IDE自身集成了adb,因此不需要配置环境变量,下载解压即可;
  ③ Airtest IDE用到python,因此需要安装部署python的环境;建议用Python3.X以上版本;
  ④ 其余用到的python的库,根据需要自行安装即可,例如OpenCV;
  ⑤ 一切就绪之后,启动AirtestIDE.exe,可以忽略注册,直接skip即可;
  ⑥ 进入到IDE,右上角的设备管理区域,建议选择use adb touch,具体界面图如下:
  注释:软件部署成功之后,连接设备之后,设备端会生成两个插件,Yosemite和PocoService。
  三、Airtest项目实践
  小编最近利用Airtest编辑浏览器自动化脚本,遇到的难点不是业务本身,而是工具资料的不全,给实践过程中带来很多不便。因此觉得有必要整理一番,以下Api均为小编实践运用,验证可行,后续会陆续补充。
  1、点击
  单击:touch((x,y)),例如,touch((200,500)),表示点击x为200,y为500的位置点;
  双击:touch((x,y),times=times),times表示点击次数;例如,touch((200,500),times=2),表示双击x为200,y为500的位置点,默认双击事件为0.01秒;
  长按:touch((x, y),duration=duration),duration为长按时间,默认为0.01;例如,touch((200,500),duration =1),表示长按x为200,y为500的位置点1秒;
  text控件点击:poco(text = text名称).click();例如,poco(text =“设置”).click(),表示点击控件text名称为“设置”的控件;
  name控件点击:poco(“控件名称”).click();例如,
  poco(“sogou.mobile.explorer.hmct:id/ff”).click(),表示点击控件name名称为“sogou.mobile.explorer.hmct:id/ff”的控件;
  resourceId控件点击:poco(resourceId =resourceId名称).click();例如,
  poco(resourceId=“sogou.mobile.explorer.hmct:id/ff”).click(),表示点击控件resourceId名称为“sogou.mobile.explorer.hmct:id/ff”的控件;
  注释:resourceId控件名称通常前面包含“r”,但是在点击时要去掉;获取设备坐标可以利用手机的开发者模式中的【显示触摸位置】。
  其他的控件内容如下:
  2、滑动
  Airtest滑动Api为swipe((x1, y1),(x2,y2),steps= 5,duration=0.2),前两个参数为滑动的前后两个坐标;steps为滑动的步数;duration为滑动的时间;例如,swipe((100,350),(200,350),steps = 5,duration=0.2)表示从坐标(100, 350)滑动5步到(200,350),滑动时间为0.2秒;
  注释:swipe中的steps默认为5,但是实践证明,对于用户教育页的场景,至少得10秒,因此为了保险起见,建议赋值10。
  3、文本输入
  Airtest文本输入Api为text(“文本信息”,enter = False,search=True),第一个参数为输入的文本信息;第二个和第三个类似,均为自动搜索,相当enter,可以不写,除非需要检验输入框内容,此时可以将第2个和第3个参数赋值Fasle;
  4、断言
  Airtest断言分为图片断言,控件断言。目前常用的是图片断言assert_exists()和控件断言exists();
  assert_exists(“图片信息”,测试描述点),例如:assert_exists(Template(图片路径), "验证是否成功")返回的为坐标点,因此作为断言,一般会采用标记位,即建立一个flag,命中则true,反之则false;
  poco(控件名称).exists(),表示控件是否存在,存在则标记位返回true;反之为false;
  5、安装应用
  Airtest安装应用的Api为install_app(apkPath,replace= False), apkPath为应用路径,replace为是否为覆盖安装开关,默认为False;用法如下:
  6、卸载应用
  Airtest卸载应用的Api为uninstall(“package_name_of_your_apk”),package_name_of_your_apk为应用包名,用法如下:
  7、启动应用
  Airtest启动应用的Api为start_app(“package_name_of_your_apk”),
  package_name_of_your_apk为应用包名,用法如下:
  8、退出应用
  Airtest启动应用的Api为stop_app(“package_name_of_your_apk”),
  package_name_of_your_apk为应用包名,用法如下:
  四、Airtest参考资料
  Airtest中文官网文档:https://airtest.readthedocs.io/zh_CN/latest/
  五、Airtest经验之谈
  ①不要直接调用Api执行,采用“先封装后调用”的方法。例如Airtest中点击,滑动的操作,直接调用不仅代码冗余,而且不美观,可读性差,可以将点击,滑动的Api进行封装,用时直接调用即可;例如可以新建一个公共类,里面包含所有原始操作,如下图:
  ② 不要直接用图片进行点击,采用控件点击的方法。图片点击不仅看着代码结构不美观,而且只局限于固定的图片,一旦UI发生改变,点击就会出现问题;
  ③ 封装的方法不要直接写死参数,采用“数据驱动”的方法。封装的目的是代码层级结构明显,可读性强,代码复用性好;
  ④ 如何调用已有的方法。例如,小编代码结构存在Common.py,在业务类中调用Common.py中的函数,可以如下操作:
  ⑤ 对于控件元素有雷同的如何处理。控件之间存在父子关系和控件对应关系,当遇到儿子或者父亲名称一样的情况,可以采取“父找子”,“子找父”,“控件对应”的方法。例如:

  六、实践不足之处
  目前的控件只适用于当前软件,一旦布局发生变化,则当前脚本不再适用,因此后续会改为“数据驱动”,动态获取数据资源,这样一来兼容性将大幅度提高。
  七、结尾
  以上是小编最近在使用Airtest期间的总结,初步满足了项目需要,后续随着业务需求的增加,小编会继续总结Airtest的用法,欢迎大家批评指正。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号