经过了一段时间的酝酿后,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 CaseClass,然后单击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所提供的兼容性测试会更加适合你。

目前Testbird为大家提供免费的兼容性测试体验(Testbird官方注册地址

Google推出iOS功能性UI测试框架EarlGrey的更多相关文章

  1. Google+ 团队的 Android UI 测试

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/android-blog/Google%2B%20%E5%9B%A2%E9 ...

  2. 记录项目代码迁移后,UI测试框架的搭建(配置文件的修改、测试脚本试运行)

    前文:记录一次项目代码迁移过程 上文代码迁移的目的就是为了新增vue脚手架自带的UI测试框架,工具有了,就需要实践运行在项目中了(修改配置文件.编写测试脚本等). 一.单元测试 测试框架 karma ...

  3. iOS 开发 之 测试框架kiwi

    1. 在Podfile中加入 target :VVStackTests, :exclusive => true do pod 'Kiwi/XCTest' end 2.下载kiwi模板 XCode ...

  4. UI测试框架

    1. 从上到下共分成4层: 用例层  组件管理层  元素管理层  公共数据层 2. 用例层: 将每条用例使用参数化, 公共参数存储到"公共数据层", 中间参数通过组件层传递 3. ...

  5. 十大免费移动程序测试框架(Android/iOS)

    十大免费移动程序测试框架(Android/iOS) 概述:本文将介绍10款免费移动程序测试框架,帮助开发人员简化测试流程,一起来看看吧. Bug是移动开发者最头痛的一大问题.不同于Web应用程序开发, ...

  6. WWDC15 Session笔记 - Xcode 7 UI 测试初窥

    https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...

  7. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  8. APP的UI自动化测试框架及平台化探索

    顾铮,10年+测试及测试开发相关经验,2014年加入京东,曾主导设计开发UI测试框架,参与CI测试平台建设,现负责iOS侧的工具,框架建设.在UI自动化,性能测试,单元测试方面有较深入研究,在App, ...

  9. [原创]移动安全测试框架MobSF介绍

    [原创]移动安全测试框架MobSF介绍 1 mobsf简介 Mobile Security Framework (移动安全框架) 是一款智能.集成型.一体化的开源移动应用(Android/iOS)自动 ...

随机推荐

  1. 【结构型】Bridge模式

    桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化.简简单单的一句话,却已经是站在了更高抽象层面上来看待.设计.解决问题.平常我们多是对具体问题进行分析.抽象,然后就开始设计,这对多数情况下基 ...

  2. 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript

    本部分主要内容 html - 基础 css - 基础 一.html 标签 html 文档标签树如下: head 部分 Meta(metadata information) 提供有关页面的元信息,例:页 ...

  3. d010: 分离自然数

    内容: 一个三位自然数,分离出它的百位.十位与个位上的数字 输入说明: 一行一个三位整数 输出说明: 一行三个数字 , 空格隔开.分别是百 十 个位数字 输入样例:   256 输出样例 : 2 5 ...

  4. 【持久化框架】Mybatis与Hibernate的详细对比

        前言 这篇博文我们重点分析一下Mybatis与hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理. Mybatis [持久化框架]Myba ...

  5. MSP430单片机的中断

    这篇文章是从网上转载过来的,原文章地址:http://www.21ic.com/jichuzhishi/mcu/questions/2012-12-21/154794.html 中断是MSP430微处 ...

  6. XJOI网上同步测试DAY14 T1

    思路:线段树维护最短路 #include<cstdio> #include<cmath> #include<iostream> #include<algori ...

  7. delphi客户端调服务器端的java webservice如何在参数中传对象? 转

    我试过java返回一个对象到delphi端没问题,可反过来,delphi通过参数传一个对象到java,java端得到的对象值变为空,不知道是不是delphi这边设置或者对象注册方面有问题,究竟该怎么解 ...

  8. HDU3473--Minimum Sum(静态区间第k大)

    Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  9. 【转】C++动态创建二维数组,二维数组指针

    原作者博客:蒋国宝的IT技术博客 今天完成一道题目需要自己用指针创建一个二维的数组,不得不承认指针的确是恶心. int **result; ; ; result = new int*[row]; ; ...

  10. build/core/base_rules.mk:195: already define

    编译错误: build/core/base_rules.mk:195: *** packages/apps/ScanDemo: MODULE.TARGET.APPS.ScanDemo already ...