乐趣区

关于测试:得物技术浅尝UI自动化之Airtest实践

一、背景

因为很多公司都采纳麻利开发的模式,测试也要跟着进行麻利测试。而每个迭代的周期十分短,常常要对原有性能进行回归测试,这样就减少了大量反复人力老本。引入 UI 自动化测试能够用来疾速回归测试 app 原有性能,测试人员只须要关注新性能的测试。其次,挪动端 App 的测试用例大部分是性能验证相干的用例,通过 UI 操作即可验证,这就为 UI 自动化提供了便当条件。因而,能够将测试反复度高,执行效率低的用例,通过 UI 自动化疾速反复执行,达到进步测试效率的目标。

二、Airtest 简介

目前支流的 UI 主动话测试工具次要有:Selenium, Appium 和 Airtest。其中 Selenium 是一款开源的 Web 利用自动化测试工具,它能够间接运行在多种浏览器平台,其反对的浏览器简直涵盖了所有支流的浏览器,然而因为得物是 APP,不须要 web 端的测试,故这个工具被仁慈舍弃。而 Appium 和 AirTest 都是针对 APP 的自动化测试工具,都能够进行主动话测试脚本的录制和回放。然而之所以抉择了 AirTest 最次要的起因是他很容易生成测试脚本,即便测试人员不会编程,不懂脚本,也能够通过失常用户的点击拖拽等操作,主动实现脚本的录制,从而大幅度降低自动化保护老本。自己通过亲自实际,从 UI 自动化小白到第一个自动化测试脚本胜利运行,用了半天工夫,感兴趣的同学能够尝试一下。

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

  • 自动化脚本录制、一键回放、报告查看,轻而易举实现自动化测试流程反对。
  • 基于图像识别的 Airtest 框架,实用于所有 Android 和 Windows 游戏反对。
  • 基于 UI 控件搜寻的 Poco 框架,实用于 Unity3d,Cocos2d 与 Android App。
  • 可能运行在 Windows 和 MacOS 上。

架构图

能够看到,底层的次要测试框架是 AirTest 和 Poco,二者区别在于:

  • AirTest:基于 Python 的、跨平台的 UI 自动化测试框架,基于图像识别原理,实用于游戏和 APP。
  • Poco:基于 UI 控件搜寻的自动化测试框架,其外围劣势是除了对 Android 和 IOS 之外,对游戏也是反对的,同时也反对微信小程序、微信小游戏和 H5 利用。

三、Airtset 装置和连贯设施

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

    无论是 Android/IOS 手机,还是 Windows 窗口,在 AirTest 中都将它视为一个设施。下边重点介绍一下 Android 设施的连贯。

连贯 Android 手机

通过 ADB 连贯电脑和 Android 手机,ADB 是 Google 官网提供的 Android 调试工具,AirTestIDE 依赖 ADB 与安卓设施进行通信。

关上 AirTestIDE,依照以下步骤进行连贯:

1. 关上手机设置 - 开发者选项 -USB 调试开关,参考安卓官网文档;

2. 在 AirTestIDE 设施面板中点击 refresh ADB 按钮,查看连贯上的设施;

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

4. 可能胜利看到设施后,点击对应设施的 connect 按钮,进行初始化。

连贯胜利后,即可在 AirTestIDE 中看到手机屏幕的镜像显示,并进行实时操作,如下图所示:

连贯 IOS 手机

要连贯一台 IOS 手机,你须要筹备好一台装置了 Xcode 的 MAC 电脑,连贯形式参考文档。

四、录制自动化脚本

在连贯上设施当前,就能够开始录制自动化测试脚本了,在接下来的内容中,我将会在一台 Android 手机上,给大家演示如何录制脚本。

模仿输出

AirTest 反对通过图像识别的形式,找到你想要的地位并进行操作,这是基于 AirTest 框架实现的。

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

录制实现后,点击“运行”,就能够运行你的第一个自动化脚本了。

如果你感觉主动录制生成的图标不够精确,还能够点击 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:断言不等

例如

查看测试报告

脚本运行结束后,点击“查看报告”那妞,会应用默认浏览器关上后果报告页面,报告中将展现每一个步骤的内容和理论执行过程的截图、运行后果,不便查看步骤是否执行胜利。

五、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 脚本示例

初始化环境

首先,就像一个一般的 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 能够在代码里间接进行调用,像这样:

在很多接口中,反对传入 Template 图片对象作为参数,在运行时将会去点击图片在画面中的所在位置,相似这样:

其中,Template 对象是一个图片类,AirTest 会先尝试在以后画面中找到匹配这张图片的地位,如果找到了,将对这个坐标进行点击操作,如果找不到,就抛出辨认异样。

断言语句

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

如何在 Python 脚本中应用 AirTest

AirTestIDE 在创立新脚本时,也可能间接创立一个.py 脚本文件,然而在创立之前会弹出一个设置窗口,要求填写一些指定的参数。

在咱们理解过 auto_setup 接口后就会晓得,这些参数就是为了传给它,而后初始化 AirTest 运行环境应用的。因而,一个纯.py 脚本的初始化代码能够是这样的:

上边这段代码的意思是说,当应用 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 第三方库办法雷同。

六、总结

本文只是简略解说了如何应用 AirTest 进行 UI 自动化脚本的录制和回放,以及对自动化脚本进行了介绍。如果要进行 UI 自动化的继续集成,还须要进一步的理解和学习。

心愿有工夫的同学能够进行一些实际,理解一下 UI 主动话相干的常识。在当前的工作中,咱们就能够将测试反复度高,执行效率低的用例,通过 UI 自动化疾速反复执行,以达到进步测试效率的目标。

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

文|Lynne

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

退出移动版