赵丽娜

简介

移动 APP 的 UI 自动化测试长久以来一直是一个难点,难点在于 UI 的” 变”, 变化导致自动化用例的大量维护。 从分层测试的角度,自动化测试应该逐层进行。 最大量实现自动化测试的应该是单元测试, 最容易实现也最容易在早期发现问题; 其次是接口级测试, 以验证逻辑为目的进行自动化, 由于接口的相对稳定, 自动化测试成本相对也可以接受; 自动化成本最大的便是 UI 级自动化测试, 然而 UI 界面是直接反馈给用户的效果展示,适度的尤其是 BVT 级的自动化测试也是非常必要的。 本文通过分析几种自动化框架的异同, 使测试人员在选择自动化框架时有所参考。

Android 自动化框架

1. Instrumentation

https://developer.android.com/reference/android/app/Instrumentation.html

Instrumentaion 是 Android 自带的一个测试框架,是很多其它测试框架的基础,可以在同进程中加载被测组件。它有很多丰富的高层封装,使用者可以使用基于 instrumentation 的其他框架,避免过多二次开发量。但 Instrumentation 不支持跨应用,导致基于 instrumentation 的框架都继承了这个缺点。

2. Robotium

https://github.com/robotiumtech/robotium

Robotium 是基于 Instrumentation 框架开发的一个更强的框架. 对常用的操作进行了易用性的封装. 用于开发功能性、系统和验收测试场景。它运行时绑定到 GUI 组件。它安装了一个测试用例套件作为在 Android 设备或仿真器上的应用程序,并提供用于执行测试的真实环境。

优点: 容易在最短的时间内编写测试脚本,易用性高。 自动跟随当前 activity。 由于运行时绑定到 GUI 组件,所以相比 Appium,它的测试执行更快,更强大。 不访问代码或不了解 app 实现,也可以工作。 支持 Activities、Dialogs、Toasts、Menus、Context Menus 和其他 Android SDK 控件。

缺点: 不能处理 flash 和 web 组件。在旧设备上会变得很慢。 由于不支持 iOS 设备,当自动化测试同时覆盖 android 与 iOS 的情况时,测试会被中断。 没有内置的记录和回放功能.,使用记录功能需要 TestDroid 和 Robotium Recorder 这样的收费工具。

3. UIAutomator

https://google.github.io/android-testing-support-library/docs/uiautomator/

UIAutomator 是由谷歌提供的测试框架,它提供了原生 Android app 和游戏的高级 UI 测试。这是一个包含 API 的 Java 库,用来创建功能性 UI 测试,还有运行测试的执行引擎。该库自带 Android SDK。

优点:它在运行访问不同的进程时,会给 JUnit 测试案例特权。库由谷歌社区支持和维护。

缺点:仅支持 android 4.1(API level 16)及以上。 不支持脚本记录。 支持的重点是 Java。 你不能获得当前活动或仪表化。 目前不支持 web 视图。 库仅支持使用 Java,因此很难和使用 Ruby 的 cucumber 混合。如想支持 BDD 框架,建议使用 Java 自己的 BDD 框架,例如 Jbehave。

4. Espresso

https://google.github.io/android-testing-support-library/docs/espresso/index.html

Espresso 是 Google 的开源自动化测试框架。相对于 Robotium 和 UIAutomator,它的特点是规模更小、更简洁,API 更加精确,编写测试代码简单,容易快速上手。因为是基于 Instrumentation 的,所以不能跨 App。

5. Calabash

https://github.com/calabash

Calabash 是一个适用于 iOS 和 Android 开发者的跨平台 app 测试框架,可用来测试屏幕截图、手势和实际功能代码。Calabash 开源免费并支持 Cucumber 语言,Cucumber 能让你用自然的英语语言表述 app 的行为,实现 BDD(Behavior Driven Development,行为驱动开发)。 Cucumber 中的所有语句使用 Ruby 定义。

优点: 有大型社区支持。 列表项 简单,类似英语表述的测试语句 支持在屏幕上的所有动作,如滑动,缩放,旋转,敲击等。 跨平台开发支持(同样的代码在 Android 和 iOS 设备中都适用)。

缺点: 测试步骤失败后,将跳过所有的后续步骤,这可能会导致错过更严重的产品问题。测试耗费时间,因为它总是默认先安装 app。 需要 Calabash 框架安装在 ios 的 ipa 文件中, 因此测试人员必须要有 iOS 的 app 源码。 除了 Ruby,对其他语言不友好。

6. Appium

http://appium.io/

Appium 是一个开源的、跨平台的自动化测试工具,支持 IOS、Android 和 FirefoxOS 平台。 通过 Appium,开发者无需重新编译 app 或者做任何调整,就可以测试移动应用,可以使测试代码访问后端 API 和数据库。它是通过驱动苹果的 UIAutomation 和 Android 的 UiAutomator 框架来实现的双平台支持,同时绑定了 Selenium WebDriver 用于老的 Android 平台测试。开发者可以使用 WebDriver 兼容的任何语言编写测试脚本,如 Java, OC, JS, PHP,Python, Ruby, C#,Clojure 和 Perl 语言。

7. Selendroid

https://www.gitbook.com/book/lihuazhang/selendroid/details

Selendroid 是一个基于 Instrumentation 的一个框架. 完全兼容 Webdriver 协议。 Selendroid 可以在模拟器和实际设备上使用,也可以集成网格节点作为缩放和并行测试。

8. Robolectric

http://robolectric.org/

Robolectric 是一款 Android 单元测试框架,但它并不依赖于 Android 提供的测试功能,它通过实现一套 JVM 能运行的 Android 代码,然后在 unit test 运行的时候去截取 android 相关的代码调用,然后转到 Robolectric 实现的代码(shadow objects)去执行这个调用的过程。因此它不像模拟器或设备需要 dexing(Android dex 编译器将类文件编译成 Android 设备上的 Dalvik VM 使用的格式)、打包、部署和运行的过程,大大减少了测试执行的时间。Pivotal 实验室声称使用 Robolectric 可以在 28 秒内运行 1047 个测试。

除了实现 Android 里面的类的现有接口,Robolectric 还给每个 Shadow 类额外增加了很多接口,可以读取对应的 Android 类的一些状态。比如它为 ImageView 提供了 getImageResourceId() 方法,测试者可以通过 getImageResourceId() 接口来确定是不是正确显示了期望的 Image。

9. RoboSpock

http://robospock.org/

RoboSpock 是一个开源的 Android 测试框架,它提供了简单的编写 BDD 行为驱动开发规范的方法,使用 Groovy 语言,支持 Google Guice 库。RoboSpock 合并了 Robolectic 和 Spock 的功能。

10. Cafe

http://cafe.baidu.com/#panel1

Cafe 是百度出品的一个基于 Robotium 的测试框架,它提供了跨进程的测试解决方案。

####11. Athrun
http://code.taobao.org/p/athrun/wiki/index/

Athrun 是 taobao 出的一个移动测试框架,它支持 Android 和 IOS。Android 部分是基于 Instrumentation,在 Android 原有的 ActivityInstrumentationTestCase2 类基础上进行了扩展,提供了一整套面向对象的 API。 IOS 上的自动化测试包括注入式自动化框架 AppFramework,和基于录制的自动化框架 Athrun_IOS, InstrumentDriver。

12. 其他

其他自动化框架还有应用于稳定性测试的 Monkey 系列(Monkey, Monkeyrunner, MonkeyTalk), 其中 MonkeyTalk 支持 iOS 和 Android,它可以为应用进行真实的,功能性交互测试。MonkeyTalk 提供简单的 "smoke tests",复杂数据驱动的测试套件。MonkeyTalk 支持原生,移动和混合应用,真实设备或者模拟器。MonkeyTalk 使得场景捕获非常容易,可以记录高级别,可读的测试脚本。还有适用于浏览器自动测试的 Selenium WebDriver,可以真实测试用户行为,用户交互如触摸、手指滚动、长按等,还支持 HTML5 的一些特性,比如本地存储、session 存储、应用缓存等。而 CTS 则是应用于兼容性测试的自动化工具, CTS 大部分是基于 Junit 和仪表盘技术编写的。还扩展了自动化测试过程,可以自动执行用例,自动收集和汇总测试结果。CTS 采用 XML 配置文件的方式将这些测试用例分组成多个测试计划(plan),第三方也可以创建自己的 plan。

总结(Android)

各个测试框架的继承关系如下, 继承关系决定了有些框架的先天优势或先天不足。在实际应用中可以集成多个框架。

IOS 自动化框架

1. XCTest

https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/01-introduction.html

XCTest 是苹果在 iOS 7 和 Xcode5 引入的一个简单而强大的测试框架,它的测试编写起来非常简单,并且遵循 xUnit 风格。XCTest 的优点是与 Xcode 深度集成,有专门的 Test 导航栏,但因为受限于官方测试 API,因此功能不是很丰富。

2. UIAutomation

https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UIAutomation.html

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

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. Calabash-ios

详见 Calabash-android 描述。

6. Subliminal

http://inkling.github.io/Subliminal/

Subliminal 是另一款与 XCTest 集成的框架。与 KIF 不同的是,它基于 UIAutomation 编写,旨在对开发者隐藏 UIAutomation 中一些复杂的细节。

7. 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 自动化测试的解决方法,但接口不够丰富。

一些有趣的自动化测试框架

1. Sikuli 图形化编程技术

http://www.sikuli.org/

Sikuli 是由 MIT 的研究团队发布的新型图形化编程技术。它以图像检索技术为基础,提供了一套基于 Python 的脚本语言以及集成开发环境。使用者可利用屏幕截图直接引用 GUI 元素进行编程,完成交互操作。Sikuli 的脚本编写遵循 Python 语法规范。由于 Sikuli 基于 Python,其核心代码由 Java 编写,可在用户自定义的 Java 工程中将其作为 Java 标准类库进行引用。

它的脚本是这样式的:

Sikuli 将 GUI 对象的屏幕截图作为函数的参数直接引用,整个代码的语义清晰明了,可读性极强。脚本执行过程中,利用图像检索算法分析匹配当前屏幕中对应的控件,并对其应用相应的鼠标或键盘操作。这种方式使得我们在脚本编写时,既无需关心繁琐的应用程序相关 API 亦不用获取 Web 内容对象。

它的缺点是:

但作为现有自动化测试工具的补充,尤其是对无法获取 API 的工程,比如 flash 动画, 是非常有效的。

2. A/B test 框架 AppGrader

虽然 AppGrader 不是一流的测试框架,但也有所长。它可以帮开发者将自己的应用与其他众多同类型应用进行多方面比较,比如图形和功能。通过对比结果,开发者可以更有针对性地提高和改进自己的应用。目前 AppGrader 仅支持 Android 平台。

3. IOS A/B test 框架 FlipTest

FlipTest 是一个优秀的 iOS app A/B 测试框架,可为 app 挑选最佳的 UI。FlipTest 会基于外观和易用性等众多因素返回测试结果,进而帮开发者解决 UI 问题。用 FlipTest 进行测试无需向 App Store 重新提交应用或者大幅更改代码,只需要在 app 中添加一行代码,节省了不少时间。

本章完~

原文链接:enter link description here


TMQ(腾讯移动品质中心)是腾讯最早专注在移动 APP 测试的团队
我们专注于移动测试技术精华,饱含腾讯多款亿级 APP 的品质秘密,文章皆独家原创,我们不谈虚的,只谈干货!

扫码关注我们

扫一扫 关注 TMQ
精彩分享不断


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