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

wolfgao · February 27, 2019 · Last by wjZero replied at August 22, 2019 · 2030 hits

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

前言

自从智能手机,智能终端,智能设备开始普及后,测试行业也出现了大量的移动测试岗位和机会,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

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

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

Apple测试框架

1. UiAutomation - Apple

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

UIAutomation是苹果早期提供的UI自动化测试框架,使用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的一个重要环节。

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

共收到 4 条回复 时间 点赞

阁下的文字确实覆盖了整个scope。
但在下有一点浅见也想发表,
有一个趋势是双端统一,
像react native, flutter这样的框架被硅谷的大公司创造了出来,
我相信这样的双端统一框架多少会在底层上改变现有测试自动化框架的生态。

shizhongping 回复

确实如此,这一点比较重要,我漏掉了,感谢提醒

wolfgao #3 · March 06, 2019 作者

好消息,ATX刚刚推出了一个远程客户端控制server,有助于测试设备的管理,部署,任务的执行,大家赶紧下载试一试吧。
https://github.com/openatx/atxserver2

子非鱼 行业流行测试框架对比 中提及了此贴 18 Mar 21:59

个人觉得既然是比较移动端是不是要涉及对webview的支持,对占比很大的微信生态的支持以及稳定性

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up