iOS 系统UI自动化测试介绍

发表于:2016-11-15来源:简书作者:孢子菌点击数: 标签:自动化测试
关于UI自动化的定义,我想要的是自动地按照流程去点击页面、输入数据,不需要人去参与,节省人工时间。比如登录,能够自己去填写用户名&密码,然后点击按钮跳转到下一个页面等

0.小目标

关于UI自动化的定义,我想要的是自动地按照流程去点击页面、输入数据,不需要人去参与,节省人工时间。比如登录,能够自己去填写用户名&密码,然后点击按钮跳转到下一个页面等。在能够保证业务的足够稳定性的条件下,UI自动化测试能够节省很多回归功能的人力。这就是我的一个小目标。

测试需要全面,需要对结果去做判断。如果熟悉单元测试或接口自动化的朋友,应该知道这些其实就是功能覆盖、用例设计、断言……这些概念。于是小目标就升级成了,一个可以重复执行,多场景的,结果可预测的UI自动化测试

1.测试基础

简介

软件测试是为了发现错误而执行程序的过程。或者说,是根据软件开发各阶段的规格说明和程序内部结构而精心设计的一批测试用例(即输入数据及预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。

白盒测试(White Box Testing) 又称结构测试、逻辑驱动测试,完全了解程序的结构和处理过程,按照程序的内部逻辑测试程序,检验程序中的每条通路是否都能按预定要求准确工作;对应到实际工作中,代码diff就是白盒测试。

黑盒测试(Black Box Testing) 又称功能测试,在程序接口进行的测试,已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。对应到工作中,Checklist&Case就是功能测试。UI自动化测试,是将功能测试中大量的重复性操作(例如线上回归)提取出来,用脚本的形式驱动设备进行测试,有着可重复运行,执行效率高的特点。

测试用例

测试用例是为特定的目的而设计的一组测试输入、 执行条件和预期的结果。

1.测试用例需要能够覆盖被测试的功能。
2.测试的结果的正确性是可判定的,每一个测试用例都应该有相应的期望结果。
3.即对同样的测试用例,系统的执行结果应当是相同的。

如何覆盖被测试功能,我们需要对输入进行分类划分:等价类划分方法,边界值分析方法。

等价类划分方法,将程序的输入域划分为若干个等价类(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。可以有效减少输入类型。例如用户名输入,可以划分为允许的字符类型:数字、字母,不允许的字符类型:特殊字符,汉字,空格等。

边界值分析方法,边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。例如用户名长度是4-10位,我们依据边界值,就需要对3、4、10、11这四个边界值分别做测试。

相对的,输出类划分后,对每一种输入都有唯一对应的输出,这个输出和功能无关,不管是正常流还是异常流,都需给出唯一结果。我们称之为断言,断言一般分为这这几类:等于、不等于、包括、不包括 或复杂的组合逻辑。

UI自动化测试用例

UI自动化在用例设计上也需满足上述性质,此外在输入中需要过程中需要定义UI的操作,同时在结果的判定上,会依赖UI元素的展示和页面的状态。比如某种异常状态下会弹窗提示,我们则需要去获取这个弹窗,然后对弹窗上UI元素进行比对和判断,而无法去做返回码的比较判断。关于页面状态的断言,相对于直接数据的比较判断不够直接、难度较大,当前还有很多难点。

2.UIAutomation

iOS4时代,Apple发布了一个名为UIAutomation的测试框架,它可以用来在真实设备和iPhone模拟器上执行自动化测试。UIAutomation的功能测试代码是用Javascript编写的。UIAutomation和Accessibility有着直接的关系,你将用到通过标签和值的访问性来获得UI元素,同时完成相应的交互操作。

UIAutomation的js测试脚本,需要在Instrument的Automation控件上测试。但是在Xcode8.0之后,Instrument已经不再有这个模块了。而Apple也不再对它维护了,推广使用UITest来替代它。

Accessibility

UIAutomation的实现原理依赖于UI控件的Accessibility,这项技术是为了辅助身体不便的人士使用 app。VoiceOver 是 Apple 的屏幕阅读技术,UI Accessibility 的基本原则就是对屏幕上的 UI 元素进行分类和标记,两者配合,通过阅读或者聆听这些元素,用户就可以在不接触屏幕的情况下通过声音来使用 app。

如果一个控件的Accessibility是可以被访问的,你就可以设置和读取它的值,作相关的操作,而当一个控件的Accessibility不可见时,你就没有办法通过automation访问它。每一个可以被访问(Accessibility enable)的UIKit控件都可以用一个Javascript对象来描述,它就是一个UIAElement。UIAElement有几个属性:name, value, elements, parent。UIKit层次树结构,可以直接映射到UIAElement的层次树。有了基本属性和层次树结构,我们就可以方便的使用JS对App中的空间进行操作了。

原文转自:http://www.jianshu.com/p/aae160cb9cc4

...