【腾讯TMQ】iOS逻辑自动化测试实践
作者:袁宜霞
团队:腾讯移动品质中心TMQ
一、怎么界定自动化测试范围
白盒测试主要测试APP的内部结构或运作,以代码实现的角度来设计测试案例。白盒测试优点在于要求测试人员去学习软件的实现,可以检测代码中的每条分支和路径,揭示隐藏在代码中的错误,对代码的测试比较彻底。
单元测试属于白盒测试的一种手段,是一种提高软件质量非常有效的方法。对于多次的迭代开发和重构,团队需要通过单元测试来看是否新的迭代对于原有的功能是否有影响。但是,单元测试在现实实践中存在的一个不可忽视的问题是:测试用例的维护成本比较高,往往对其维护的工作量并不比被测代码的开发量小。所以,本文引入了逻辑自动化测试概念,希望能在高价值和维护成本中找到平衡。
逻辑自动化测试:考虑到手机APP的UI的多变性,仅对非UI相关的逻辑业务类进行自动化测试,优先对外接口。在本文中,以iOS手机管家为例子,逻辑自动化测试的范围选定为ObjectController文件夹中的类,此文件夹中的类文件均为与UI无关的业务逻辑类。
二、IOS单元测试框架使用和代码覆盖率查看
XCTest是Xcode5中新引入的一个测试框架,它非常简单并且与 Xcode 的 IDE 直接集成,并且其单元测试的代码不会打包到开发的项目工程里面,隔离性比较好。
1、如何新建测试用例
打开项目工程,file -》new-》target-》iOS-》iOS Unit testing bundle(输入名字和选择language),之后在此文件夹下new file新建测试用例类。
Ps:测试类继承XCTestCase类,并且测试用例必须以test开头。
2、如何执行
有两种方式:一种是UI执行,一种是命令执行。
1)UI执行方式如下:
a、直接点击每个test example 前面的菱形可单独执行特定用例;
b、在“show the test navigator”下可以点击播放按钮制定测试用例类下的全部测试用例;
c、使用command+U执行全部测试用例。
2)使用命令执行测试用例:
xcodebuild 测试target名 -scheme 工程scheme名 -destination ‘platform=iOS Simulator,name=iPhone 6s Plus’
Ps: 如果执行报错为:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7),那么需要修改testtarget 的属性(包括:修改testtarget中build settings下的build active architecture only改为no,同时valid architects添加 armv7 和arm64(与工程保持一致,$(ARCHS_STANDARD)))。
3、如何收集代码覆盖率
a、首先在product->scheme->Edit Scheme里面,选中test工程,将Code Coverage模式打开;
b、执行测试用例;
c、打开Xcode左边窗口的Report Navigator(图标类似微信聊天气泡),找到 Project Log,选择这个Log实例,并选择coverage能看到代码覆盖率汇总数据;
d、双击你想要查看的类,可以查看代码执行次数。对于未执行代码,可根据具体的情况增加测试用例;
e、实现持续交付中的代码覆盖率数据收集,关注类似如下路径的代码覆盖率数据文件:
/Users/root/Library/Developer/Xcode/DerivedData/GTFreeWifi-ewrjegavxhprvpfjdppzjkiuytaa/Logs/Test/D23E533C-7C7D-123E-911F-B096C72C602A.xccoverage。
此文件可以使用xcov-core进行解析为json文件,以文本记录了每个文件的代码覆盖率数据,便于进一步加工:
xcov-core -s test.xccoverage -o report.json
Json文件内容举例如下:
Ps:代码覆盖率仅供参考,单纯追求覆盖率是不可行的,覆盖率只是衡量测试投入的指标,和代码质量并没有直接的关联,另外当覆盖率达到一定程序之后,继续提升覆盖率时投入和产出可能不成正比,效益可能会下降。所以,代码覆盖率数据要进行一定的平衡,即做到保证一定的质量,又做到对于人力资源的合理使用。
三、典型的测试场景
1、异步测试场景
在接口测试时,我们常常会碰到异步测试场景,比如iOS手机管家中与后台请。
求相关的接口(小资讯请求、诈骗短信云查杀等),都需要等待后台返回结果数据到客户端。在等待子线程完成任务时候,我们继续主线程其他代码执行,同时,异步等待子线程返回的结果数据,并用回调函数来处理即将接收的结果数据。
在XCode6以上版本中,苹果添加了用于异步回调测试的api,因此不用像旧版本那样,发起异步调用后通过循环查询标志位,来检查异步回调函数的调用了。在新版本中直接使用XCTestExpectation的API即可实现这一功能。
a、Block方式回调;
在单测开始位置声明需要使用的Expectation对象,在回调中触发fulfill函数,单测的末尾调用api进行等待,举例如下:
b、代理Delegate方式回调;
与block方式回调类似,不过由于回调函数在单测函数外侧,需要把变量声明到类中,举例如下:
8
Ps:如果希望保持测试用例与被测工程代码的独立性,回调函数需要在测试类中进行重写;否则,被测工程代码需要做些调整(例如:直接在工程代码中增加宏,在当前模式为测试模式时,在对应的回调函数中进行fulfill调用)。
2、如何访问private私有变量和私有方法
a、私有变量的访问和修改;
在做iOS接口测试时,会需要check私有变量是否有预期变化的情况或者修改。
私有变量的值,共有如下两种方式。
b、私有方法的访问和修改
对私有方法的访问同样有两种方法:
3、mock的使用
对于一些不容易构造或不容易获取的对象,可以创建一个虚拟的对象(mock object)来完成测试。实现思想就是根据要mock的对象的class来创建一个对应的对象,并且设置好该对象的属性和调用预定方法后的动作(例如返回一个值,执行其他方法,设置参数中的返回值和返回异常等等),然后将其记录到一个数组中,接下来开发者主动调用该方法,最后做一个verify(验证),从而判断该方法是否被调用,或者调用过程中是否抛出异常等。
在iOS手机管家的逻辑接口测试中选用通用的开源OCMock,配置和OCMock的使用参看如下连接文档:http://ocmock.org/
a、mock返回一个值;
举例:在iOS手机管家的加密相册功能中,手机硬件是否支持3Dtouch会影响其登录流程。如下使用了OCMock来mock isTouchIDSupported 接口,使得其返回设定值YES。
Ps:如下中,通过调用stopMocking可以返回真实的状态,如果在测试结束前需要保存一个实际情况的数据这个方法是比较合适使用的。StopMocking后mock的方法就不能再继续使用了。
b、mock执行其他方法;
举例:如下的mock对象调用isTouchIDSupported方法时,将会调用checkbox对象的isChecked方法。本例中,在mock之前已经将checkbox的isChecked属性值设置为YES,所以调用[checkbox isChecked]返回的值是YES。注:mock执行其他方法需要保证返回值与mock对象调用方法的返回值类型一致。
OCMStub([classMock isTouchIDSupported]).andCall(checkbox,@selector(isChecked));
c、mock设置参数中的返回值;
对于函数返回值放在参数中的情况,即参数传递的是一个指针的指针,直接不执行mock函数,而是将返回值直接设置给返回值参数。举例如下:
d、mock一个异常返回。
在单元测试中,也常常需要mock一个异常返回,从而去保证异常路径得到覆盖。如下为一个简单示例:
4、模拟后台数据返回
对于黑盒测试,如果要后台返回特定的数据需要配单,且还难以模拟一些后台。
返回异常数据情况。有了单元测试后,我们可以在不配单情况下指定后台返回数据,检查客户端对于后台的正常和异常返回处理是否得当。在集成测试前,做验证模块内部的逻辑正确性,避免在联调时花费过多的时间来解决小问题,提高联调的效率。
举例:iOS手机管家问问中一次更新拉取,如果后台有超过20篇以上的文章,那么仅返回前20条。黑盒测试方案,我们必须在后台配置至少20篇以上文章。在接口自动化测试中,先模拟后台有超过20篇文章,检查是否有做好仅显示前20篇文章客户端逻辑。
在做接口测试时,常会碰到返回值为viod的方法,并不总是构造输入参数,得到返回值。对于没有返回值的方法,一定有一些可以被观测的地方,比如说一个对象的状态被改变,所以必须找到合适的断点。如果找不到,说明这个方法无用,不需要做测试。
举例:iOS手机管家的游戏中心的icon图标下载,没有返回值,但在本地有存入图标文件,那么就可以在测试用例中check这个文件是否存在,继而判断是否成功下载。
四、小结
在实际工作中尝试逻辑自动化测试在帮助被测产品发现问题的时候,也能提高测试人员自身的代码能力,一举两得。
协助产品提升质量主要在于:
1、输出自动化用例,让代码重构和优化更放心;
2、在集成测试前,有机会做验证模块内部的逻辑正确性,避免在联调时花费过多的时间来解决小问题,提高联调的效率;
3、其他产出为:产品bug,code review问题,测试分析框架图,根因分析,可测性分析等。
提升测试人员自身代码能力主要在于:
1、掌握代码,积累代码编写和调试经验,分析问题与解决问题的经验;
2、辅助问题分析,遇到问题时,可以借助分析单元测试代码来了解模块的一般行为。
关注腾讯移动品质中心TMQ,获取更多测试干货!
版权所属,禁止转载
【腾讯TMQ】iOS逻辑自动化测试实践相关推荐
- 【腾讯TMQ】基于模型的自动化测试工具——GraphWalker
一.概述 GraphWalker就是一个基于测试模型的用例生成工具.它主要应用于FSM, EFSM模型.可以用来它可以直接读取FSM, EFSM图形模型.json模型.生成测试用例. 二.背景知识 要 ...
- 【腾讯TMQ】走进标准化测试
一.引言 为避免大篇幅的概念介绍,我们直接从项目实践入手,为读者朋友理解标准化测试.在开始,只要理解标准化测试是为了解决项目测试实际问题而产生的测试方案即可. 二.背景介绍 手机QQ浏览器(iPhon ...
- 基于 KIF 的 iOS UI 自动化测试和持续集成
客户端 UI 自动化测试是大多数测试团队的研究重点,本文介绍猫眼测试团队在猫眼 iOS 客户端实践的基于 KIF 的 UI 自动化测试和持续集成过程. 一.测试框架的选择 iOS UI 自动化测试框架 ...
- 【腾讯TMQ】测试建模兵器谱
引子 有人的地方就有江湖,有测试的地方就有建模. 每个产品都是一片江湖,每一次迭代就是一场武林大会,而一个个的需求,就是一封封战书. 测试同学在面对复杂的需求时候,往往不得其力,导致测试时间过长,测试 ...
- GrowingIO 数据采集 iOS SDK 测试实践
作者:吕雨强 GrowingIO iOS 测试工程师,主要负责 iOS SDK 功能测试.自动化测试 . GrowingIO 是基于用户行为数据的增长平台,精准采集用户行为数据是公司业务的基石,只有及 ...
- 【腾讯TMQ】激情测试-冒烟军团的远征
[腾讯TMQ]激情测试-冒烟军团的远征 一.冒烟起源篇 冒烟测试的概念在整个测试组其实已经使用很久,在FT化之后,冒烟测试下发到各个FT里面进行把控,一直是一个不温不火的状态. 在版本节奏越来越快的背 ...
- vos3000落地网关对接教学_跨国合作:Serverless Components 在腾讯云的落地和实践
导语 | Serverless Components 是 Serverless Framework 推出的最新解决⽅案,具有基础设施编排能⼒,开发者通过使⽤ Serverless Components ...
- 【腾讯TMQ】MBT探索系列 – PRE/POST 模型在网络接口测试MBT的应用和探索
目录 ⊙MBT 是什么? ⊙PRE/POST 模型是什么? ⊙如何建立PRE/POST模型? ⊙OCL是什么? ⊙OCL怎么建立PRE/POST模型? ⊙PRE/POST模型MBT 实践 一.MBT是 ...
- Appium搭建MacOS环境下的iOS App自动化测试环境(Windows搭个MacOS虚拟机就行,亦无须iPhone)
前言 经过上篇文章<Windows上Appium自动化测试Android应用>的介绍,我们已经学习App自动化测试的基本知识,接下来我们来学习如何对iOS进行基于Appium的自动化测试. ...
最新文章
- 现在还需要掌握linux文本模式吗?
- kafka使用_kafka使用Interceptors实现消息端到端跟踪
- Android Studio如何减小APK体积
- PHP双码率视频云转码服务网站源码 支持M3u8秒切
- 【AI视野·今日CV 计算机视觉论文速览 第212期】Thu, 3 Jun 2021
- win32汇编 多线程编程与事件
- java txt转换excel_Java实现将txt文件转成xls文件的方法
- vscode 文件高亮插件_实用的Visual Studio Code插件
- 原生js实现的日期选择插件
- Gson解析JSON数组
- 简单易用的程序多开器软件-V5程序多开器提供下载
- 设计模式之 Factory Mode 工厂模式:Swift 实现
- A/B Test(AB测试) 流程、常见面试问题及解答
- Doom3 couldn't load default.cfg
- 官方:长城保护坚持不改变原状、最低干预原则
- 计算机网安全模式,电脑安全模式有什么用?
- IOS免费抓包神器——Stream
- CAD图纸中标注显示成问号?
- 游戏辅助原理与制作01.扫雷-01基址
- 芯片的制造过程与三大主设备
热门文章
- L3-007 天梯地图
- 爬取全国各地区汽车销量情况并用中国地图可视化展示
- iOS AV Foundation 二维码扫描 02 扫码
- 资料搜集-JAVA系统的梳理知识3-面试篇
- 从国企到阿里的面试经历(一)
- C语言去除图像的离散区域,Visual C++数字图像实用工程案例精选
- Kafaka报错:Creating topics with default partitions/replication factor are only supported in CreateTopi
- android wp8相机,WP8.1版HTC One M8相机的5个优点
- 工厂的生产管理系统,即时掌握车间生产动态
- 知识图谱技术在大数据时代的必要性分析