经过了一段时间的酝酿后,Google很高兴地宣布了EarlGrey,一款针对于iOS的功能性UI测试框架。诸如YouTube、Google Calendar、Google Photos、Google Translate、Google Play Music等多款Google应用都成功地采用了EarlGrey框架来满足其功能性测试之所需。
EarlGre的特点
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并不兼容。 1. Cmd+Click应用源文件所在的目录,然后选择New file...。这时会弹出一个对话框。
2. 在弹出的对话框中选择Unit Test Case Class,然后单击Next。在下一个界面中,输入测试用例的名字。对于该示例来说,我们输入MyFirstEarlGreyTest。 3. 在下一个界面中,请确保测试与Unit Test目标关联起来。对于该示例来说,目标就是SimpleAppTests。
4. Xcode会为我们创建一个新的测试用例,不过这个用例我们用不上。我们来修改其代码,只留下一个测试方法,并包含进EarlGrey框架。
5. 现在来添加一个简单的EarlGrey断言,检查一个key window是否存在,并断言它会显示出来。下面就是最终的测试代码: 6. 就是这些了!就像其他单元测试一样,该测试会显示在测试导航器中,因此可以单击run图标或是Cmd+clicking测试名,然后选择Test “testPresenceOfKeyWindow”来运行测试。由于这是个常规的单元测试,因此可以在测试与应用代码中打断点,也可以无缝使用内建工具。
适合谁用
它基于XCTest(XCode自带的)做了扩展,你可以理解为它是一个更好用的XCtest。
这种侵入式的框架(需要在XCode集成或者命令行里面把测试bundle打到应用里面),意味着这款工具主要是面向有开发能力的工程师,此外,由于是白盒测试,所以主要还是让开发者们测自己的APP。
因此,如果你是一个独立开发者,那么它对你而言会是一款非常棒的测试工具。
解决不了的问题
EarlGre不能代替基于真机的测试。也就是说APP在真实设备上的兼容性问题,无法通过软件模拟的方式暴露出来。如果你想要避免因硬件问题导致的用户流失,你还是需要在几百台真实手机上对APP进行测试。
当你需要在几百台手机上做测试时,自动化的真机测试能够快速帮你解决战斗。所以,如果你是一名不具备写代码能力的测试工程师,公司又恰好需要你做大规模的真机测试,那么TestBird所提供的 APP测试会更加适合你。
|