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

前言

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

主要框架和点评

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

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

跨平台测试框架

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 的一个重要环节。

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


↙↙↙阅读原文可查看相关链接,并与作者交流