移动客户端测试/UI Testing 开源框架梳理和大比拼

移动客户端测试框架梳理和讨论

前言

自从智能手机,智能终端,智能设备开始普及后,测试行业也出现了大量的移动测试岗位和机会,iphone是2007年诞生,Android也是差不多时间开始走向市场,测试行业的同仁们从那天起,就开始孜孜不倦地研究移动客户端的测试框架,测试策略或者测试方法。经过差不多10年多的发展,我们现在可以找机会来做一个总结。总之,学习就是温故而知新,要不断学习新的东西才能保证不掉队。如果从产品的角度来看,这些测试框架解决了什么问题,给测试从业者带来什么价值?

跨平台框架梳理和点评

对这些框架横向比较就会发现,这些框架有以下这些特点:

  • 跨平台化,多端支持:无论从支持的平台还是开发语言,都有这个趋势,比如Appium,基本支持所有的开发语言。
  • 提供用例编写的IDE:降低脚本开发门槛,让工具成为工具,很多年前测试开发对人员要求还是很高,需要有较强的开发经验才能胜任,而现在从群里面交流的情况看,很多人没有语言背景,经过短暂的学习也能胜任一些测试开发工作。
  • 开源化:之前各家大公司都是自己搞一套系统自己用,现在大家都喜欢拿出来和大家一起用,这个方向很好,对一些小公司来说真是雪里送炭,比如网易就很棒,做的系统不错,而且全部开源:ATX和Airtest这两个框架真的使用者很多。
  • CI的支持越来越好:目前所知的框架基本上都支持CI的工具,比如通过Jenkins来驱动;
  • 这一点不是很强烈,但是我还是希望列在这里,目前开放的框架对Python的支持越来越好,或者基本上成为主流,不知道大家是否认同;
  • 架构层次更加清晰:客户端,服务端,代理端,每一端干自己的事情,多端合作完成测试
  • 报告的部分也越来越专业:一方面报告的插件越来越多(比如Htmlreport,allure),图表在报告中越来越重要,也画的越来越专业。

以上,也希望大家一起总结,从中我们看到未来这个行业的发展趋势,我们学习的方向,还是很值得的一件事。

1. Appium

为啥把这个放在第一位,虽然我没有做过市场调研,也没有相关的市场报告,但是就多年在这个市场了解的情况来说,appium的市场占有率应该是top1。
而且下面很多框架其实都是借鉴或者和Appium的价格类似。

Appium的官方网站: http://appium.io/
官方介绍:

Appium is an open source, cross-platform test automation tool for native, hybrid and mobile web and desktop apps. We support simulators (iOS), emulators (Android), and real devices (iOS, Android, Windows, Mac).

TesterHome 也专门给Appium做了一个专栏,大家可以访问Appium的中文Wiki网址: https://testerhome.com/wiki/appiumdoccn
以笔者的试用经验来看,这里虽然有些坑,但是上手还是很快的,而且网上有大量的文档可参考,如果是做App的UI或者黑盒测试,应该是首选。

2. ATX 框架 - 网易贡献

ATX的QQ交流群 497460177

ATX Github官方站点: https://github.com/NetEaseGame/ATX

系统架构图 : https://testerhome.com/topics/7236

集成IDE Weditor : https://testerhome.com/topics/7978
可以查看UI结构的编辑器 atx-webide: https://github.com/openatx/atx-webide

  • Android相关
    目前已经升级到UiAutomator2,强烈建议用这个,atx的 uiaotomator2 github地址 : https://github.com/openatx/uiautomator2
    Android的WebView支持说明 : https://testerhome.com/topics/7232
    实战: 如何测试网易云音乐 : https://testerhome.com/topics/5654
    游戏实战类
    游戏测试实例入门(如何测试网易阴阳师) https://testerhome.com/topics/6218
    用 ATX 进行简单的功能冒烟(未知游戏) https://testerhome.com/topics/7995

  • iOS相关
    iOS 真机如何安装 WebDriverAgent : https://testerhome.com/topics/7220
    iOS 控件操作 API : https://testerhome.com/topics/7204
    更详细的控件操作API : https://github.com/openatx/facebook-wda
    探索类
    基于 WebDriverAgent 的 iOS 远程控制 https://testerhome.com/topics/8890
    关于ATX系统集成测试 https://testerhome.com/topics/8984
    分类汇总 https://testerhome.com/topics/node78

3. Airtest 框架 - 网易贡献。

这个框架现在非常流行,QQ群爆满,原打算是打算给游戏方面,在Google的IO大会也展示过,个人觉得是目前推广的最好,门槛更低的一个版本,应该是ATX的进化版本(ATX也支持游戏测试).
提供的IDE非常不错,可以图像化编写用例,基本上秒上手。

官网主页和IDE下载: http://airtest.netease.com/
github地址: https://github.com/AirtestProject/Airtest
入门教程: http://airtest.netease.com/tutorial/Tutorial.html

QQ群:437119175 群人员数目当前快1500
TesterHome也有他的专门精华汇总,我这里就不一一展开
Airtest UI 自动化测试项目 Airtest Project 资源汇总: https://testerhome.com/topics/12486

4. Macaca框架 阿里打造

[官网地址】(https://macacajs.github.io/zh/): https://macacajs.github.io/zh/
说实话,我对Macaca也搞过一段时间,但是阿里的人喜欢用js,因此如果你对js比较强,这个框架也是不错的,其实原理和AirTest基本一致。
Macaca入门文章: https://testerhome.com/topics/15414

iOS 和 Android 应用使用 Macaca 测试的例子。
自动化平台系列 - 使用 Macaca 测试 iOS 应用: https://testerhome.com/topics/4359
自动化平台系列 - 使用 Macaca 测试 Android 应用: https://testerhome.com/topics/4442

5. Robot Framework

如果对英文没有障碍的话,直接访问官网地址: https://robotframework.org/
主要开发语言是Python/Java,更多是面向验收,面向需求的一种测试框架,可以和Appium结合起来,也可以单独运行。
另外Robot Framework也可以用于web的接口测试,而且他的测试数据非常容易整理和输入。

github 地址 : https://github.com/robotframework/robotframework
同时github有个Robot framework的学习工程也比较推荐: https://github.com/up1/course-robotframework
examples: https://robotframework.org/#examples

6. Calabash

官方主页: http://calabash.sh
是一个比较老的测试框架,不是很推荐
他基于robotium开发,使用了 cucumber 框架,通过 http 和 json 与模拟器和真机上安装的测试 apk 通信,测试 apk 调用 Robotium 的方法来进行 UI 自动化测试,支持行为驱动开发(BDD)的自动化测试工具
优点:

  • 封装了常用的step操作,如滑动、点击、拖拽、输入、截图等
  • 支持WebView的识别和用例编写
  • 适应于Android各版本
    缺点:
  • 不支持跨进程的应用测试,目前的解决办法是通过ruby调用控制台adb命令来完成跨进程的操作

Android 测试框架

1. Robolectric

这个是谷歌目前非常推崇的一个测试框架,在某年的IO大会专门有介绍,大家可以自己找找看。
目前国内推广的不是很多,这个不需要apk就可以在JVM直接跑起来,因此在这方面收到谷歌的推荐,大家都知道如果要编译apk,然后在跑一次测试要几乎占用10分钟左右时间,这个也就1~2分钟左右。
官方网址:http://robolectric.org/

Running tests on an Android emulator or device is slow! Building, deploying, and launching the app often takes a minute or more. That’s no way to do TDD. There must be a better way.
Robolectric is a framework that brings fast and reliable unit tests to Android. Tests run inside the JVM on your workstation in seconds.

国内目前使用这个框架的人少,原因是国内企业不像美国西海岸的企业那么重视单元测试,单元测试应该是程序员的一项必须完成的任务,在提交代码的时候必须有这部分测试结果。
另外在谷歌的测试基本框架中70%是单元测试,20%是Instrumental测试,10%是endtoend的测试,也就是最后的功能黑盒测试,这个和国内目前的实践正好相反。
英文没有问题的,建阅读以下 Testing Fundamentals

2. ESpresso - 谷歌出品

官网地址: https://code.google.com/p/android-test-kit/wiki/Espresso
其原理是这样的,在Android中,Activity是承载UI控件的Android基本组件,Espresso则是可操作Activity的Google原生UI自动化框架。
Espresso特点有写法简单易入手,不可跨进程等(跨进程可使用Uiautomator),实践中可以和Robolectric结合起来使用。
学习参考https://google.github.io/android-testing-support-library/docs/espresso/index.html。
TesterHome有一篇文章大家也可以看看, [腾讯 TMQ] 当 Espresso 遇见 Android 单元测试

3. UiAutomator - 谷歌出品

在Android测试没有不知道这个东东,这么目前发展到了UiAutomator2,比第一版更好用些,支持的操作也多了一些,比如手势操作等。在谷歌的测试框架里面,这个属于medium或者large测试,主要用于app的功能/UI测试,不需要app的包,直接从系统dump他们的UI的layout,找到root node之后,下面可以建立一个数结构,然后就可以找到每一个widget的ID或者其他属性,必须借用Accessbility Service.
UiAutomator是目前很多开源框架之本,很多框架都用Python或者其他语言完成一个wrapper,方便对他的调用。
或者这么说,PC端各种语言作为客户端和服务器(比如Appium)来沟通,Appium服务端再和手机的agent沟通下达测试指令,这些指令再和上面说的对UiAutomator的wrapper类沟通完成最后对UI的控制。

4. Robotium

一个比较老的框架,目前的影响力越来越小,现在几乎没人在用它。

iOS 测试框架

1. UiAutomation - Apple

关于苹果的UI testing,之前大家一直用的就是UiAutomation,但是在Xcode8.0之后,Instruments已经不再有这个模块了。而Apple也不再对它维护了,推广使用UITest来替代它。

UIAutomation使用Javascript编写。基于UIAutomation有扩展型的工具框架和驱动型的框架。扩展型框架以JavaScript扩展库方法提供了很多好用js工具,注入式的框架通常会提供一些Lib或者是Framework,要求测试人员在待测应用的代码工程中导入这些内容,框架可以通过他们完成对app的驱动。驱动型UI Automation 在自动化测试底层使用了UI Automation库,通过TCP通信的方式驱动UI Automation来完成自动化测试,通过这种方式,编辑脚本的语言不再局限于JavaScript。
https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UIAutomation.html

2. XCTest - Apple

Testing Tips & Tricks
Testing is an essential tool to consistently verify your code works correctly, but often your code has dependencies that are out of your control. Discover techniques for making hard-to-test code testable on Apple platforms using XCTest. Learn a variety of tips for writing higher-quality tests that run fast and require less maintenance.

Xcode提供了XCTest框架用以编写测试代码。在创建Xcode工程时,Xcode默认使用XCTest,并且默认创建了Unit Test(单元测试)和 UI Test(界面测试)两个Target,我们可以直接使用。
其实这点和谷歌一样,谷歌在创建一个app的时候,也会有两个folder,一个是Unit test folder;一个是Instrumentation folder,可以进行UI或者功能测试。
有兴趣的同学可以好好看看 2018年的WDC视频: : https://developer.apple.com/videos/play/wwdc2018/417

3. Frank http://www.testingwithfrank.com/

Frank是iOS平台一款非常受欢迎的app测试框架,它使用Cucumber语言来编写测试用例, Frank包含一个强大的“app inspector”--Symbiote,可以用它来获得运行中app的详细信息,便于开发者将来进行测试回顾。 它允许使用Cucumber编写结构化英语句子的测试场景。 Frank要求测试时在应用程序内部编译,这意味着对源代码的改变是强制性的。操作方式为使用Cucumber和JSON组合命令,将命令发送到在本地应用程序内部运行的服务器上,并利用UISpec运行命令。

优点: 测试场景是在Cucumber的帮助下,用可理解的英语句子写的。 强大的Symbiote实时检查工具。 活跃的社区支持。 不断扩大中的库。
缺点: 对手势的支持有限。 在设备上运行测试有点难。 修改配置文件需要在实际设备上运行。 记录功能不可用。

4. KIF http://www.oschina.net/translate/ios-ui-testing-with-kif

KIF是Keep It Functional项目的缩写,是一款iOS app功能性测试框架,使用Objective-C语言编写,对苹果开发者来说非常容易上手,更是一款开发者广为推荐的测试工具。KIF tester使用私有API来了解App中的视图层级。但缺点是运行较慢。

5. Kiwi https://github.com/kiwi-bdd/Kiwi/wiki/Getting-Started-with-Kiwi-2.0

Kiwi是对XCTest的一个完整替代,使用xSpec风格编写测试。 Kiwi带有自己的一套工具集,包括expectations、mocks、stubs,甚至还支持异步测试。它是一个适用于iOS 开发的Behavior Driven Development(BDD)库,优点在于其简洁的接口和可用性,易于设置和使用,非常适合新手开发者。Kiwi使用Objective-C语言编写,易于IOS开发人员上手。

总结(IOS)
IOS自动化测试框架继承关系如下。 XCTest与 Xcode 的 IDE 直接集成,使用简单, 但其不支持stub和mock, 所以单使用XCTest框架的较少。 Kiwi是一个iOS平台十分好用的行为驱动开发BDD的测试框架,有着非常漂亮的语法,可以写出结构性强,非常容易读懂的测试。 UI Automation是Apple官方提供的UI自动化测试的解决方法,但接口不够丰富。

KIF、Frank、Calabash都是通过使用代码的形式来模拟事件触发,使得被测代码就像是由用户行为所触发的一样。但这样的代价是插入一个额外层的复杂度。
IOS测试框架中支持BDD的有calabash 和Kiwi。
可选用的单元测试框架有Kiwi,Specta,Quick等,而KIF,Subliminal和calabash更适用于UI级验收测试。

跨平台开源测试框架PK

从产品的角度看,一个框架(当做一个产品)首先看解决了什么问题?或者说解决了什么痛点需求,再看如何解决?还要看用户反馈如何?后续发展和迭代等等一起来进行评价。
另外,下面的比拼只是对跨平台(Android/IOS/Web)的几款产品进行比拼,纯粹支持Android或者Apple的略过。

工具 Appium ATX Airtest Macaca Robot Framework Calabash
安装 中等 中等 中等 中等 简单 简单
多语言 几乎全部 Python/Java Python为主 JS为主 JS为主 Ruby/Objective-C
用例开发IDE
上手难易度 中等 中等 中等 高(会ruby语言的人少)
脚本录制
测试报告
热度和社区支持
CI的支持 支持 支持 支持 支持 支持 支持
Web支持 支持 支持 支持 支持 支持

展望未来

根据以上的信息收集,论坛调查和反馈,结合个人的思考,简单谈一下几个未来发展方向,请多多拍砖:
1)Android以后会用Kotlin,更简洁,因此未来的Android测试框架要支持Kotlin。
2)提供用例编写IDE不是必须的,但是nice to have,让你的使用者忠诚度更高,的确加速用例编写的效率和降低了门槛,这应该是个发展方向。其实对Android来说也不难,AirTest集成了minicap和minitouch,这个IDE基本就完成了一半。
3)目前大部分测试框架都是给测试人员的,基本上都是UI测试,其实我希望在Unit test上是否有效率更高的产品出来,帮助开发工程师写高质量,覆盖率更高的单元测试。
4)测试结果和测试报告和CI平台集成也是一个重要特征,要满足Devops的需求,成为app pipeline的一个重要环节。

以上,其实无论选择哪款测试框架,只有精通了基本都可以满足你的需要。
但是如果在初学和刚刚接触的时候,对他们有更多,更详细的了解,货比三家,选择自己更适合的框架可能会事半功倍。希望这里提供的资料和对比给你带来有益的帮助,由于时间仓促或者知识浅薄,欢迎指正和批评。

你可能感兴趣的:(移动客户端测试/UI Testing 开源框架梳理和大比拼)