前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS 逻辑自动化测试实践

iOS 逻辑自动化测试实践

原创
作者头像
腾讯移动品质中心TMQ
修改于 2017-07-26 09:25:28
修改于 2017-07-26 09:25:28
3.2K0
举报

作者:袁宜霞 团队:腾讯移动品质中心TMQ

一、怎么界定自动化测试范围

白盒测试主要测试APP的内部结构或运作,以代码实现的角度来设计测试案例。白盒测试优点在于要求测试人员去学习软件的实现,可以检测代码中的每条分支和路径,揭示隐藏在代码中的错误,对代码的测试比较彻底。

单元测试属于白盒测试的一种手段,是一种提高软件质量非常有效的方法。对于多次的迭代开发和重构,团队需要通过单元测试来看是否新的迭代对于原有的功能是否有影响。但是,单元测试在现实实践中存在的一个不可忽视的问题是:测试用例的维护成本比较高,往往对其维护的工作量并不比被测代码的开发量小。所以,本文引入了逻辑自动化测试概念,希望能在高价值和维护成本中找到平衡。

逻辑自动化测试:考虑到手机APP的UI的多变性,仅对非UI相关的逻辑业务类进行自动化测试,优先对外接口。在本文中,以iOS手机管家为例子,逻辑自动化测试的范围选定为ObjectController文件夹中的类,此文件夹中的类文件均为与UI无关的业务逻辑类。

二、IOS单元测试框架使用和代码覆盖率查看

XCTest是Xcode5中新引入的一个测试框架,它非常简单并且与 XcodeIDE 直接集成,并且其单元测试的代码不会打包到开发的项目工程里面,隔离性比较好。

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方式回调类似,不过由于回调函数在单测函数外侧,需要把变量声明到类中,举例如下:

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!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于XCTest的iOS自动化测试
2. 创建Test Class 如果要在Test Target中创建新的Test Class,选中目标Test Target,使用File -> New -> File ,可以看到有UI TestClass和Unit Test Class两种类,如下图:
用户5521279
2019/06/02
3.9K0
这是有赞的分层自动化测试实践
先理一下自动化测试的概念,从广义上来说,一切通过工具(程序)的方式来代替或者辅助手工测试的行为都可以成为自动化。从狭义上来说,通过编写脚本的方式,模拟手工测试的过程,从而替代人工对系统的功能进行验证。
DevOps时代
2019/12/17
1.5K0
这是有赞的分层自动化测试实践
后台自动化测试与持续部署实践
作者:cloudyzhao,腾讯 PCG 后台开发工程师 随着 DevOps 研发模式思想的普及,“测试左移”、“开发负责质量”等理念也开始深入各业务团队。本文以一个实际项目( LogReplay )的 DevOps 实践为例,介绍如何通过可测性提升、自动化测试、持续集成和持续部署流程,最终实现后台微服务的高质量、持续、自动化部署。 测试左移是 DevOps 研发模式中开发全面负责质量的核心环节之一,而测试左移的一个重要手段,就是在开发过程中的各环节快速执行大量有效的自动化测试用例,从而尽早地发现得到质量
腾讯技术工程官方号
2022/04/19
2K0
后台自动化测试与持续部署实践
基于 KIF 的 iOS UI 自动化测试和持续集成
客户端 UI 自动化测试是大多数测试团队的研究重点,本文介绍猫眼测试团队在猫眼 iOS 客户端实践的基于 KIF 的 UI 自动化测试和持续集成过程。 测试框架的选择 iOS UI 自动化测试框架有不少,其中 UI Automation 是 Apple 早期提供的 UI 自动化测试解决方法,用 JavaScript 编写测试脚本,通过标签和值的可访问性获得 UI 元素,来完成相应的交互操作。 一些第三方 UI 解决方案以 UI Automation 为基础,对其进行补充和优化,包括扩展型 UI Automa
美团技术团队
2018/03/12
2.4K0
基于 KIF 的 iOS UI 自动化测试和持续集成
PICK一下,iOS自动化测试新方案出道
一、背景 自动化测试一直是测试中非常重要的一环,好的自动化测试方案,不仅能够节省测试人力,而且能够发现很多人工测试不能发现的问题。 传统的iOS自动化测试方案大多基于UI自动化或是基于MOCK的单元测试,但是两者的缺点也是显而易见的,对于UI自动化测试,存在运行不稳定与维护成本高的问题,对于单元测试的MOCK编写用例成本又太高,投入产出比较低。 基于以上背景,本文提供了一个新的iOS自动化测试的方案,该方案的主要实现是在APP运行是获取APP的内存数据,能够直接调用对应的方法,而不需要通过控件树或者MO
腾讯移动品质中心TMQ
2019/06/06
2.3K1
PICK一下,iOS自动化测试新方案出道
Java 后端自动化测试
自动化测试是指使用自动化工具或脚本来执行测试用例,以减少人工测试的工作量,提高测试效率和准确性。
AlphaHinex
2024/08/14
2380
Java 后端自动化测试
Python自动化测试指南—Mock与单元测试的深入应用
在软件开发过程中,自动化测试是确保代码质量和稳定性的关键一环。而Python作为一门灵活且强大的编程语言,提供了丰富的工具和库来支持自动化测试。本文将深入探讨如何结合Mock与单元测试,利用Python进行自动化测试,以提高代码的可靠性和可维护性。
一键难忘
2024/08/04
3770
持续演进的接口自动化测试方案
接口自动化测试是个老生常谈的话题,基本上每个测试团队都会涉及,市面上大部分文章会从如何设计框架去讲解。但是这一次我想回归自动化的根本价值,从持续演进的解决方案出发,讲解有赞测试团队的心路历程和对于接口自动化的理解,欢迎交流。
有赞coder
2020/10/27
1.6K0
持续演进的接口自动化测试方案
C/C++ 单元自动化测试解决方案实践
C/C++ 开发效率一直被业内开发人员诟病,单元测试开发效率也是如此,以至于开发人员不愿花时间来写单元测试。那么我们是不是可以通过改善编写单元测试的效率来提升项目的测试用例覆盖率?
2020labs小助手
2022/06/01
1.7K2
腾讯文档EP之路 —CI x 自动化测试
点击上方蓝字关注我们! | 导语  持续集成强调开发人员提交了新代码之后,立刻进行构建、测试。根据测试结果,确定新代码和原有代码能否正确地集成在一起。本文介绍了腾讯文档项目中自动化测试在持续集成中的实践。 背景 腾讯文档自动化测试种类较多。包括了:单元测试,bvt测试,集成测试(包括了基于接口输入输出进行验证的端到端测试和Web端API接口测试),e2e测试(UI触发UI验证的界面自动化测试)以及性能测试。 测试代码编写语言,使用框架种类较多。由于大部分前端测试框架单元测试与e2e测试相互独立,所以
腾讯移动品质中心TMQ
2020/09/10
3.2K0
《自动的自动化测试智能化一站式API测试服务》
TiD2019质量竞争力大会邀请了新奥集团中台质量总监陈磊为参会者带来《自动的自动化测试智能化一站式API测试服务》精彩演讲。陈磊从智能化测试框架、智能化API测试框架打造过程、自解耦&自测试的检测装置和智能化解耦服务与智能化测试结合四方面讲述API测试服务。
Criss@陈磊
2019/10/16
2.4K0
UI自动化测试、接口测试等自动化测试策略
UI测试是最接近软件真实用户使用行为的测试类型。通常是模拟真实用户使用软件的行为,即模拟用户在软件界面上的各种操作,并验证这些操作对应的结果是否正确。
孟船长
2019/12/24
2.2K0
iOS单元测试的那些事儿
作为客户端开发,很多时候我们过多的关注于功能的测试,而忽略标准的单元测试。其实,单元测试是保障项目稳定性的最有效且成本最低的测试方式。越偏向底层服务的代码,越需要使用单元测试来对可靠性进行保障。一旦单元测试覆盖完成,则之后再进行代码优化和迭代的时候则会有引入新问题的几率会大为减小。
珲少
2022/09/16
1.3K0
iOS单元测试的那些事儿
使用postman 自动化测试接口
软件测试是软件开发的重要组成部分,是贯穿整个软件生命周期,对软件产品进行验证和确认的活动过程,其目的是尽早发现软件产品中存在的各种问题,如与用户需求、预先定义不一致等问题。
狂奔滴小马
2021/11/15
1K0
使用postman 自动化测试接口
有赞iOS精准测试实践
近几年有赞零售业务快速发展,为了满足日益增多的业务需求,2019年起零售客户端发版改成了每周一次,在质量保障方面,技术团队要面对更大的挑战。故此我们团队做了很多研究,希望通过技术工具来提升移动端测试的质量和效率,这是我们研发移动端精准测试平台的初衷。
有赞coder
2020/08/24
2.4K1
有赞iOS精准测试实践
前端自动化测试
如果你的项目要长期使用并维护的话,那么代码自动测试就非常有必要使用。因为没人能保证在修改代码后,不会引发其他额外 bug(功能失效,渲染失败),而在修改完代码后,跑一遍测试就能很大程度让开发者发现自己所修改的代码是否存在问题,是否会导致原有功能失效。
愧怍
2022/12/27
7010
前端自动化测试
关于自动化测试的定位及一些实践思考
大家对自动化的理解,首先是想到WebUI自动化,这就为什么我一说自动化,公司一般就会有很多人反对,因为自动化的成本实在太高了。其实自动化是分为三个层面的(UI层自动化、接口自动化、单元测试),不是每个层面的自动化都是遥不可及的,以下标示一下这三个层面的难易程度(也叫这个为自动化金字塔):
顾翔
2019/12/11
7310
关于自动化测试的定位及一些实践思考
自动化测试在 Go 开源库中的应用与实践
Go 语言内置的 go test 命令和 testing 库,为自动化测试提供了纯天然的支持。最近,因为 mongo-driver 官方库已发布 v2 版本,我需要为我开源的 go-mongox 库进行兼容升级。经过几个小时的开发和调试,升级工作顺利完成,其中自动化测试在整个流程起到关键作用,大大提高了工作效率。
陈明勇
2024/11/01
1700
自动化测试在 Go 开源库中的应用与实践
微信团队自动化测试化实践
作为后台开发 Coder,你可能会对以下场景感到似曾相识:历史上处理过的 BUG 反复横跳;版本兼容逻辑多,修复一个 BUG 触发了更多 BUG;上线时系统监控毫无异常,过段时间用户投诉某个页面无数据;改动祖传代码时如履薄冰,心智负担极重。为此本文提出一个自动化测试系统,它能够低成本实现100%的测试用例覆盖率,极大减轻管理自动化测试用例的工作量并提高测试效率,保障后台服务平稳变更。欢迎阅读~
FunTester
2023/08/04
5450
微信团队自动化测试化实践
实践Jenkins集成Cobertura自动化构建SpringBoot工程
文章摘要:追求代码质量一直都是优秀程序员对自己的目标,那么有什么好方法能够实现这个目标?
用户2991389
2018/09/05
3.4K1
实践Jenkins集成Cobertura自动化构建SpringBoot工程
相关推荐
基于XCTest的iOS自动化测试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档