本文来源于我在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所提供的主要特性如下所示,这些特性使得应用的测试变得更加轻松,也更具效率:
EarlGrey是个原生iOS UI自动化测试框架,可以帮助你编写出更加清晰、简明的测试。借助于EarlGrey框架,你可以使用增强的同步特性。EarlGrey会自动与UI、网络请求及各种查询保持同步,同时在必要的情况下,你还可以手工实现自定义的定时器。EarlGrey的同步特性可以确保在执行动作前,UI会处于一种稳定的状态。这极大地增强了测试稳定性,使得测试变得高度可重复。EarlGrey与XCTest框架协同工作,并且集成到了Xcode的Test Navigator中,这样你就可以直接在Xcode中或是在命令行中(使用xcodebuild)运行测试了。
EarlGrey的用户文档位于EarlGrey/docs目录下。要想上手,请先查看一下EarlGrey的特性,看看其向后兼容性,然后通过测试目标来安装/运行EarlGrey。配置完毕后,请查看一下EarlGrey API,然后开始编写自己的测试。
下面来介绍一下如何安装EarlGrey,以及如何创建并运行第一个测试。
要想正常使用EarlGrey,请确保被测试的应用满足如下需求:
最后,请确保在测试目标上启动断言(即不要设置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并不兼容。
@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的项目文件中。