移动端UI自动化技术调研

写 bug 的大耳朵图图
·

关键词

  • Python
  • Airtest
  • Cucumber
  • Gherkin
  • Android/IOS自动化
  • BDD

背景

  1. 实现公司内部移动端产品自动化测试,主要是IM功能
  2. 需要支持IOS和Android平台
  3. 可以持续集成
  4. 要求上手难度低,便于维护

技术选型

UIAutoMator2

uiautomator2 是一个可以使用Python对Android设备进行UI自动化的库。其底层基于Google uiautomator,Google提供的uiautomator库可以获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作。 github: https://github.com/openatx/uiautomator2

优点:

  • 设备和开发机可以脱离数据线,通过WiFi互联(基于atx-agent
  • 集成了openstf/minicap达到实时屏幕投频,以及实时截图
  • 集成了openstf/minitouch达到精确实时控制设备
  • 修复了xiaocong/uiautomator经常性退出的问题
  • 代码进行了重构和精简,方便维护
  • 实现了一个设备管理平台(也支持iOS) atxserver2
  • 扩充了toast获取和展示的功能

缺点:

  • 需要手动元素定位,对于非webview页面支持不好
  • 需要使用者熟悉python
  • 不支持IOS平台

Appium

Appium 是一个开源工具,用于自动化 iOS 手机、 Android 手机和 Windows 桌面平台上的原生、移动 Web 和混合应用。**「原生应用」指那些用 iOS、 Android 或者 Windows SDKs 编写的应用。「移动 Web 应用」是用移动端浏览器访问的应用( Appium 支持 iOS 上的 Safari 、Chrome 和 Android 上的内置浏览器)。「混合应用」**带有一个「webview」的包装器——用来和 Web 内容交互的原生控件。类似于 Apache Cordova 项目,创建一个混合应用使得用 Web 技术开发然后打包进原生包装器创建一个混合应用变得容易了。重要的是,Appium 是跨平台的:它允许你用同样的 API 对多平台(iOS、Android、Windows)写测试。做到在 iOS、Android 和 Windows 测试套件之间复用代码。 github: https://github.com/appium/appium

优点:

  • 支持IOS,Android,Windows平台上的原生,移动web和混合应用
  • 基于webdriver协议开发,支持跨平台,允许使用相同的api对多平台应用编写测试
  • 支持的语言种类多
  • 功能强大,可以替代uiautomator2

缺点:

  • IOS应用测试只支持在mac平台上运行
  • 执行效率相对于uiautomator较慢
  • 中文输入必须使用appium自带的中文输入法
  • API较多,学习成本高,而且新版本不太稳定

AirTest

AitTest是由网易公司开发的用于移动端游戏和app自动化测试的工具,现已在github上开源 AirtestProject是由网易游戏推出的UI自动化测试解决方案,项目构成如下:

1)Airtest框架

Airtest 是一个跨平台的、 基于图像识别 的UI自动化测试框架,适用于游戏和App,支持平台有Windows、Android和iOS:

2)Poco框架

Poco 是一款 基于UI控件识别 的自动化测试框架,目前支持Android原生、iOS原生、Unity3D、cocos2dx、UE4和Egret等平台,也可以在其他引擎中自行接入poco-sdk来使用。

3)AirtestIDE

AirtestIDE 是一款跨平台的 UI自动化测试编辑器 ,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写 Airtest 和 Poco 代码。

4)手机集群解决方案-DeviceFarm

DeviceFarm 是网易推出的自动化测试集群解决方案,它是软硬件一体化方案,包含设备集群建设、集群设备批量维护管理、监控报警和云端真机等功能,可以为您在企业内部搭建稳定高效的设备管理平台, 提升设备利用率,赋能自动化测试流程搭建:

5)Airlab云测试平台

Airlab云测试平台支持用例管理、脚本管理、任务预约、任务调度、云端报告等功能,可以快速构建企业自动化测试全流程,支持ios和安卓的回归测试及兼容测试。

github:https://github.com/AirtestProject/Airtest

优点:

  • 跨平台
  • 元素定位基于图像识别,无需编写复杂的元素定位代码
  • 提供IDE,可以辅助测试人员编写自动化用例
  • 官方文档提供了较多的实用教程,方便测试人员上手
  • 提供移动端自动化测试平台的私有化部署,但是收费
  • 提供了丰富的API,方便在其他框架中整合

缺点:

  • 由于图像识别算法是基于open-cv,对于复杂的页面,图像识别的准确性不高
  • 运行环境搭建比较复杂,需要安装比较多的依赖
  • 用例执行效率较低,也是图像识别的锅,因为这玩意儿本身效率就不高

Flybirds

Flybirds是基于BDD模式和AirTest开发的移动端UI自动化测试工具

  • 基于BDD模式,类自然语言语法
  • 支持自动化APP操作、表单提交、UI元素校验、键盘输入、Deeplink跳转等
  • 默认支持英文、中文两种语言,支持更多语言扩展
  • 插件式设计,支持用户自定义自动化扩展
  • 提供cli脚手架,快速搭建项目
  • 提供html报告

github: https://github.com/ctripcorp/flybirds

优点:

  • 使用BDD模式,类自然语言语法,编写的用例直观易懂,默认支持中文和英文两种Feature编写方式
  • 底层基于AirTest开发,具备AirTest的优势
  • 支持自定义插件,扩展性强
  • 自带step模板,支持绝大多数页面操作,也支持自定义step模板
  • 有cli模式,支持持续集成

缺点:

  • 由于使用了BDD模式,测试人员需要了解Gherkin语法
  • 跟AirTest一样,执行效率不高
  • 对于没有text的页面,元素定位会比较麻烦
  • 刚开源不久,没啥人用,相关的社区和文档不多

总结

通过以上4种移动端UI自动化的对比,可以得出以下结论:

  1. 对于原生Android平台应用,使用UIAutomator2是比较方便的选择。
  2. 对于跨平台应用,Appium和AirTest还有Flybirds都是可以考虑的。
  3. Appium基于webdriver协议,使用统一的API来实现跨平台操作,但是对于APP内嵌的h5页面,支持不好。
  4. AirTest是基于图像识别来操作,存在效率低和准确率不高的问题,尤其是一个页面元素图标很相似的时候,可能会出现无法识别的问题,但是airtest提供了方便实用的IDE,能大大减轻元素定位的负担,并且支持将自动化脚本打包成apk,可以通过adb shell来执行自动化测试。
  5. Flybirds的创新在于使用了BDD模式,测试人员无需编写复杂的测试代码即可完成测试,但是此工具目前并不流行,网上也缺少相关的讨论和技术文档,出了问题都不好排查。

建议使用优先级

AirTest > Flybirds> Appium > UIAutomator

参考文档

  1. 开源 | 携程机票BDD UI Testing框架 - Flybirds
  2. Github-flybirds
  3. 携程机票BDD-UI-Testing框架Flybirds
  4. airtest
  5. behave
  6. multiple-cucumber-html-reporter
  7. uiautomator2源码解析
  8. UIAutomator2的使用
  9. about-appium
  10. airtest-doc
社区准则 博客 联系 社区 状态
主题