Google推出iOS功能性UI测试框架EarlGrey
Posted 风中叶的思考
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google推出iOS功能性UI测试框架EarlGrey相关的知识,希望对你有一定的参考价值。
本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/02/earlgrey-ios-functional-ui-test
经过了一段时间的酝酿后,Google很高兴地宣布了EarlGrey,一款针对于iOS的功能性UI测试框架。诸如YouTube、Google Calendar、Google Photos、Google Translate、Google Play Music等多款Google应用都成功地采用了EarlGrey框架来满足其功能性测试之所需。
EarlGrey所提供的主要特性如下所示,这些特性使得应用的测试变得更加轻松,也更具效率:
- 强大的内建同步机制:测试会在与UI进行交互前自动等待动画、网络请求等事件。这样,我们就可以更加轻松地编写测试了(无需睡眠,也不必再等待了),同时维护起来也更加容易(非常直观,整个测试看起来就是一系列描述而已)。一般来说,你无需考虑同步性,因为EarlGrey会自动同步UI、网络请求、主Dispatch Queue以及主NSOperationQueue。为了支持在下一个UI交互发生前需要等待某个事件出现这种场景,EarlGrey提供了Synchronization APIs,你可以通过他们来控制EarlGrey的同步行为。你可以使用这些APIs来增强测试的稳定性。
- 可见性检测:所有的交互都发生在用户可以看到的元素上。比如说,尝试轻拍图片后面的按钮会导致测试立刻失败。EarlGrey使用了屏幕截图区分比较(也叫做“screenshot diffs”)在与UI元素交互前确定其可见性。这样,你就可以确定对于EarlGrey与之交互的UI,用户可以看到并且也能与之交互。值得注意的是,进程外(即系统生成的)警告视图与其他会遮盖住UI的模态对话框会对这个过程产生干扰。
- 灵活的设计:用于确定元素选择、交互、断言与同步的组件在设计上就是可扩展的。轻拍与滑动是通过应用级的触摸事件来实现的,而不是使用元素级的事件处理器。在每一次UI交互前,EarlGrey都会断言交互的元素是可见的,而不仅仅是存在于视图层次体系中就行了。EarlGrey的UI交互模拟了真实用户与应用UI交互的方式,可以帮助你找到并修复用户在使用应用时所遇到的同样的Bug。
EarlGrey是个原生iOS UI自动化测试框架,可以帮助你编写出更加清晰、简明的测试。借助于EarlGrey框架,你可以使用增强的同步特性。EarlGrey会自动与UI、网络请求及各种查询保持同步,同时在必要的情况下,你还可以手工实现自定义的定时器。EarlGrey的同步特性可以确保在执行动作前,UI会处于一种稳定的状态。这极大地增强了测试稳定性,使得测试变得高度可重复。EarlGrey与XCTest框架协同工作,并且集成到了Xcode的Test Navigator中,这样你就可以直接在Xcode中或是在命令行中(使用xcodebuild)运行测试了。
EarlGrey的用户文档位于EarlGrey/docs目录下。要想上手,请先查看一下EarlGrey的特性,看看其向后兼容性,然后通过测试目标来安装/运行EarlGrey。配置完毕后,请查看一下EarlGrey API,然后开始编写自己的测试。
下面来介绍一下如何安装EarlGrey,以及如何创建并运行第一个测试。
要想正常使用EarlGrey,请确保被测试的应用满足如下需求:
- 正确的启动界面图片可以在所有支持的设备上出现(参见iOS Developer Library,Launch Files)。
- 主UIApplicationDelegate实现了(UIWindow *)window属性(参见UIKit Framework Reference,window属性)。
最后,请确保在测试目标上启动断言(即不要设置NS_BLOCK_ASSERTIONS)。可以通过两种方式将EarlGrey添加到Xcode项目中:使用CocoaPods,或是以框架的形式。
Cocoapods安装
对于EarlGrey来说,我们强烈推荐使用CocoaPods进行安装,这也是我们认为的最佳方式。
第1步:创建一个测试目标。
EarlGrey需要一个测试目标。由于EarlGrey修改了测试目标的Scheme与Build阶段,因此我们建议你为添加EarlGrey测试创建一个单独的测试目标。如果还没有创建,那么可以在Xcode的Project Navigator中选中项目,然后单击菜单中的Editor > Add Target...。
在Add Target窗口中,选择iOS -> Test -> iOS Unit Testing Bundle:
由于EarlGrey使用了Schemes,因此测试目标必须要有一个与之关联的Scheme。如果该Scheme是共享的就更好了。如果测试目标没有Scheme,那么请转向Manage Schemes,单击+按钮,然后从下拉菜单中选择目标。选择Shared选项,然后将Container设为待测试的应用。
值得注意的是,如果之前创建过Schemes,那么你需要运行一次才能让pod安装命令将其选中。如果在运行pod install之后,测试目标没有包含对Scheme与Build阶段的改变,那么请再次运行pod install。
第2步:添加EarlGrey并作为框架依赖
创建好测试目标后(比如说AppFunctionalTests),现在就需要将EarlGrey作为框架依赖添加进来了。要想做到这一点,请将EarlGrey作为测试依赖添加到Podfile中。由于EarlGrey必须要放在待测试的应用中,我们需要对测试目标的Build Phases与Scheme进行一些修改。将configure_earlgrey_pods.rb文件添加到项目目录中(在这里运行pod install命令)。你需要在post_install钩子中调用这个脚本,使用项目名、测试目标名与xcscheme文件名。
第3步:运行pod install命令
当成功运行了pod install命令后,打开生成的工作空间,在Pods/directory中即可以找到安装好的EarlGrey。
创建与运行第一个测试
由于EarlGrey基于XCTest,因此在Xcode中创建第一个测试就像创建一个新的单元测试用例类一样简单。请不要将Unit Test Case Class与UI Test Case Class搞混了。UI Test Case Class使用了添加到XCTest中的新的UI Testing特性,它与EarlGrey并不兼容。
- Cmd+Click应用源文件所在的目录,然后选择New file...。这时会弹出一个对话框。
- 在弹出的对话框中选择Unit Test Case Class,然后单击Next。在下一个界面中,输入测试用例的名字。对于该示例来说,我们输入MyFirstEarlGreyTest。
- 在下一个界面中,请确保测试与Unit Test目标关联起来。对于该示例来说,目标就是SimpleAppTests。
- Xcode会为我们创建一个新的测试用例,不过这个用例我们用不上。我们来修改其代码,只留下一个测试方法,并包含进EarlGrey框架。
- 现在来添加一个简单的EarlGrey断言,检查一个key window是否存在,并断言它会显示出来。下面就是最终的测试代码:
- 就是这些了!就像其他单元测试一样,该测试会显示在测试导航器中,因此可以单击run图标或是Cmd+clicking测试名,然后选择Test “testPresenceOfKeyWindow”来运行测试。由于这是个常规的单元测试,因此可以在测试与应用代码中打断点,也可以无缝使用内建工具。
@import EarlGrey #import@interface MyFirstEarlGreyTest : XCTestCase @end @implementation MyFirstEarlGreyTest - (void)testPresenceOfKeyWindow { [[EarlGrey selectElementWithMatcher:grey_keyWindow()] assertWithMatcher:grey_sufficientlyVisible()]; } @end
想要试一下EarlGrey么?EarlGrey目前已经开源,并且基于Apache许可。感兴趣的读者可以看看这份上手指南,然后通过CocoaPods或是手工的方式将EarlGrey添加到Xcode的项目文件中。
以上是关于Google推出iOS功能性UI测试框架EarlGrey的主要内容,如果未能解决你的问题,请参考以下文章
Google 的 Mobile UI 框架 Flutter Preview 1 发布