得物技术浅尝UI自动化之Airtest实践

1、背景

因为不少公司都采用敏捷开发的模式,测试也要跟着进行敏捷测试。而每一个迭代的周期很是短,常常要对原有功能进行回归测试,这样就增长了大量重复人力成本。引入UI自动化测试能够用来快速回归测试app原有功能,测试人员只须要关注新功能的测试。其次,移动端App的测试用例大部分是功能验证相关的用例,经过UI操做便可验证,这就为UI自动化提供了便利条件。所以,能够将测试重复度高,执行效率低的用例,经过UI自动化快速重复执行,达到提升测试效率的目的。html

2、Airtest简介

目前主流的UI自动话测试工具主要有:Selenium, Appium和Airtest。其中Selenium是一款开源的Web应用自动化测试工具,它能够直接运行在多种浏览器平台,其支持的浏览器几乎涵盖了全部主流的浏览器,可是因为得物是APP,不须要web端的测试,故这个工具被残忍舍弃。而Appium和AirTest都是针对APP的自动化测试工具,均可以进行自动话测试脚本的录制和回放。可是之因此选择了AirTest最主要的缘由是他很容易生成测试脚本,即便测试人员不会编程,不懂脚本,也能够经过正经常使用户的点击拖拽等操做,自动完成脚本的录制,从而大幅度下降自动化维护成本。本人通过亲身实践,从UI自动化小白到第一个自动化测试脚本成功运行,用了半天时间,感兴趣的同窗能够尝试一下。python

AirtestIDE 是一个跨平台的UI自动化测试编辑器,适用于游戏和App。它的特色以下:android

  • 自动化脚本录制、一键回放、报告查看,垂手可得实现自动化测试流程支持。
  • 基于图像识别的 Airtest 框架,适用于全部Android和Windows游戏支持。
  • 基于UI控件搜索的 Poco 框架,适用于Unity3d,Cocos2d与Android App。
  • 可以运行在Windows和MacOS上。

架构图
image (9).jpegweb

能够看到,底层的主要测试框架是AirTest和Poco,两者区别在于:编程

  • AirTest:基于Python的、跨平台的UI自动化测试框架,基于图像识别原理,适用于游戏和APP。
  • Poco:基于UI控件搜索的自动化测试框架,其核心优点是除了对Android 和IOS以外,对游戏也是支持的,同时也支持微信小程序、微信小游戏和H5应用。

3、Airtset安装和链接设备

    目前AirTestIDE 提供了Windows和Mac两个版本的客户端,请从官网下载,解压即用。小程序

    不管是Android/IOS手机,仍是Windows窗口,在AirTest中都将它视为一个设备。下边重点介绍一下Android设备的链接。微信小程序

链接Android手机

经过ADB链接电脑和Android手机,ADB是Google官方提供的Android调试工具,AirTestIDE依赖ADB与安卓设备进行通讯。api

打开AirTestIDE,按照如下步骤进行链接:浏览器

1.打开手机设置-开发者选项-USB调试开关,参考安卓官方文档微信

2.在AirTestIDE设备面板中点击 refresh ADB 按钮,查看链接上的设备;

3.若是没有显示出设备,试试restart ADB,若是还不行,参考FAQ文档进行问题排查。

4.可以成功看到设备后,点击对应设备的connect 按钮,进行初始化。

链接成功后,便可在AirTestIDE中看到手机屏幕的镜像显示,并进行实时操做,以下图所示:
image - 2021-06-11T181846.170.png

链接IOS手机

要链接一台IOS手机,你须要准备好一台安装了Xcode的MAC电脑,链接方式参考文档

4、录制自动化脚本

在链接上设备之后,就能够开始录制自动化测试脚本了,在接下来的内容中,我将会在一台Android手机上,给你们演示如何录制脚本。

模拟输入

AirTest支持经过图像识别的方式,找到你想要的位置并进行操做,这是基于AirTest框架实现的。

咱们能够先看看如何自动录制脚本:点击AirTestIDE左侧的AirTest辅助窗上的“录制”按钮,而后随着你在设备窗口上操做手机,代码会自动生成在代码窗口中。

录制完成后,点击“运行”,就能够运行你的第一个自动化脚本了。
截屏2021-06-11 下午6.19.36.png

若是你以为自动录制生成的图标不够准确,还能够点击AirTest辅助窗上的 touch 按钮,而后再设备窗口上框选精确的图标,也能够制动生成一条touch语句。以下:
https://www.qq.com/video/e325...

相似的模拟输入操做还有滑动:点击swipe按钮,在设备窗口上框选精确的图标最为滑动起点,而后点击滑动终点位置,即会自动生成一个swipe语句。

其余的模拟输入的API包括:

  • Text:文字输入
  • KeyEvent:按键输入,包括(HOME/BACK/MENU等)
  • Sleep:等待
  • Snapshot:截屏

断言

到这里,咱们已经有各类模拟输入方法,配合逻辑控制语句让手机动起来。自动化测试中还有很重要的一个步骤:结果验证。咱们就能够来看看怎样声明断言。

(1)验证UI界面

录制方法与模拟输入相似。

  • assert_exists:断言图片存在
  • assert_not_exists:断言图片不存在

(2)验证数值

经过Poco获取属性值,手写代码进行断言。

  • assert_equal:断言箱单
  • assert_not_equal:断言不等

例如
image (10).jpeg

查看测试报告

脚本运行完毕后,点击“查看报告”那妞,会使用默认浏览器打开结果报告页面,报告中将展现每个步骤的内容和实际执行过程的截图、运行结果,方便查看步骤是否执行成功。
image - 2021-06-11T183346.186.png

image (12).jpeg

5、AirTest脚本介绍

AirTest是一款基于Python的,跨平台的UI自动化测试框架,基于图像识别原理,适用于游戏和APP。虽然能够借助IDE提供的录制功能快速的生成脚本,可是一般来讲,熟练掌握Python语法可以帮助咱们写出应用更普遍、更不容易出错的脚本。

一个简单的.air脚本解析

在下载解压Airtest脚本的专属IDE——AirtestIDE后,点击“新建脚本”按钮,默认便可建立一个后缀名为.air的脚本文件,.air这是Airtest脚本的专属后缀。

让咱们打开刚才新建脚本的文件夹,能够看到实际上.air脚本文件是一个普通的文件夹,里面附带了一个同名的.py文件,AirtestIDE在执行脚本时,实际上执行的是里面的.py文件。也就是说,Airtest脚本本质上还是Python脚本,遵循的是Python语法,咱们能够根据实际须要自由地import其它Python第三方库。

值得注意的是,.air文件夹中必需要有同名的.py文件,不然在命令行执行airtest run test.air这样的运行指令时会致使失败。

AirTest脚本示例

image (13).jpeg

初始化环境

首先,就像一个普通的Python脚本同样,咱们须要在代码文件的最开头部分,写上from airtest.core.api import *,将AirTest 的主要API都import进来,以便在后续脚本中使用这些API。

auto_setup是一用来初始化环境的接口,接口文档在这里,它接受4个参数,咱们能够设置当前脚本所在的路径、指定运行脚本的设备、设置默认的log路径和设置脚本父路径。

  • 若是auto_setup不传入任何参数,AirTest将会读取运行时命令行中传入的各项参数,来对环境进行初始化。
  • 在AirTestIDE建立脚本时,默认生成的代码里是最简单的初始化代码auto_setup(__file__),意思是将脚本文件做为脚本路径传入,其余参数内容将默认读取运行命令行传入的参数。

脚本运行命令行有两种形式,命令行中的参数包含device,log等:

  • 命令行运行AirTest脚本的示例:>airtest run untitled.air --device Android:///手机设备号 --log log。
  • 在使用AirTestIDE运行脚本时,会在"Log 查看窗"中自动生成一个可用的命令行,能够供你们做为参考。

模拟点击

Airtest做为自动化测试框架,模拟的是人的操做,常见的接口主要有:

  • Touch点击某个位置,能够设定被点击的位置、次数、按住时长参数
  • Swipe从一个位置华东到另外一个位置
  • Text调用输入法输入指定内容
  • KeyEvent输入某个按键响应,礼盒回车键、删除键
  • Wait等待某个指定的图片元素出现
  • Snapshot对当前画面截一张图
  • 其余

核心API请参见文档,在这个文档页里出现的API都是跨平台API,因为咱们在代码的第一行里将airtest.core.api里的接口所有import进来了,所以这些API能够在代码里直接进行调用,像这样:
image (14).jpeg
在不少接口中,支持传入Template图片对象做为参数,在运行时将会去点击图片在画面中的所在位置,相似这样:
image (15).jpeg
其中,Template对象是一个图片类,AirTest会先尝试在当前画面中找到匹配这张图片的位置,若是找到了,将对这个坐标进行点击操做,若是找不到,就抛出识别异常。

断言语句

断言在单元测试代码中很是重要,所以建议在咱们的脚本里使用断言语句来断定被测应用当前的涨停是不是咱们预期中的状态。Airtest提供了assert_exists和assert_not_exists两个接口,来断言一张图片存在或者不存在于当前画面中。同时,还提供了assert_equal和assert_not_equal两个语句,来断言传入的两个值相等或者不相等。

如何在Python脚本中使用AirTest

AirTestIDE在建立新脚本时,也可以直接建立一个.py脚本文件,可是在建立以前会弹出一个设置窗口,要求填写一些指定的参数。

在咱们了解过auto_setup接口后就会知道,这些参数就是为了传给它,而后初始化AirTest运行环境使用的。所以,一个纯.py脚本的初始化代码能够是这样的:
image (16).jpeg
上边这段代码的意思是说,当使用python xxx.py来运行本文件,且不带任何命令行参数是,则自动使用auto_setup这个接口来对AirTest相关的参数进行初始化。这样只须要在写py脚本时,填好指定的参数就能直接用python xxx.py指令来运行脚本。

同时,原先传统的airtest run xxx.air --devices Android: /// 命令行方式也不受影响,只要脚本检测到传入了命令行参数(即代码中的 if not cli_setup()判断),就依然优先使用命令行参数来初始化AirTest环境。

固然,熟练掌握API的各位,也能够根据实际需求在本身的Python脚本中调用AirTest API,与使用正常的pyhton第三方库方法相同。

6、总结

本文只是简单讲解了如何使用AirTest进行UI自动化脚本的录制和回放,以及对自动化脚本进行了介绍。若是要进行UI自动化的持续集成,还须要进一步的了解和学习。

但愿有时间的同窗能够进行一些实践,了解一下UI自动话相关的知识。在之后的工做中,咱们就能够将测试重复度高,执行效率低的用例,经过UI自动化快速重复执行,以达到提升测试效率的目的。

此外,本文只是介绍了经过AirTest的框架进行图像识别,编写测试脚本,可是在某些特殊状况下,例如对于游戏或者APP里的动态元素,经过图像识别比较困难。AirTest还提供了另一种基于UI控件搜索的自动化框架Poco,同窗们能够在下边的文章中,进行学习和实践。详情请查看:https://edu.uwa4d.com/lesson-...

文|Lynne

关注得物技术,携手走向技术的云端