iOS开发之XCTest

0.前言

在介绍XCTest之前,我们先来了解两个基本概念BDD(Behavior Driven Development-行为驱动开发)与TDD(Test Driven Development-测试驱动开发)

0.1TDD-测试驱动开发

Test Driven Development即测试驱动开发,它是一种用一种测试先于编写代码的思想来指导软件开发。测试驱动开发是敏捷开发中的一项核心实践和技术,其原理是在开发功能代码之前,先编写单元测试用例代码,从而通过测试代码确定需要编写什么具体的开发代码

0.2 BDD-行为驱动开发

顾名思义,行为驱动开发是指以软件实际要达到的目标也就是需求设计来驱动整个开发过程,更关注于用户故事,即产品、开发者、测试人员一起头脑风暴,分析实际对应用户对于该软件的需求,然后将这些需求写成一个个的故事。开发者负责填充故事的内容满足用户需求,测试者负责检验这些故事的结果是否是用户所希望的成果。相比较TDD来说,这种开发形式可以尽可能的避免用户和开发者在沟通上的障碍,实现客户和开发者同时定义系统的需求,避免因为理解需求不充分而带来的不必必要的工作量。

1.单元测试

在讲XCTest之前我们先来了解一下单元测试。单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证,通过开发者编写代码去验证被测代码是否正确的一种手段,例如编写一个测试函数去测试某一功能函数是否能正确执行达到预期效果。在实际项目开发中使用单元测试可以提高软件的质量,也可以尽量早的发现代码中存在的问题加以修正。

2.iOS开发中的XCTest

XCTest是Xcode自带的单元测试框架,我们可以使用该框架做功能性代码的白盒单元测试,以自测并增强代码健壮性。

2.1在项目中添加XCTest

我们可以通过两种方式在我们的项目中添加:

2.1.1创建项目时直接勾选改选项

创建时勾选

创建项目成功过项目目录下即可看到对应的单元测试文件夹


项目目录

2.1.2项目创建后添加

点击Show the Test navigator选项可以看到现在我们项目中是未添加单元测试的


未添加单元测试

点击下方➕按钮,选中New Unit Test Target选项
然后配置参数


参数配置

点击Finish即可
添加完成项目目录

2.2简介

添加完测试单元后我们再来了解一下如何添加测试文件(以TempProject项目为例)。选中TempProjectTests文件夹->点击右键->New File->选择Unit Test Case Class->继承自XCTestCase类,可以看到如下图测试文件已被创建


添加完成

你可能已经注意到了,嗯?只有一个.m文件?是的。下面我们来解释一下XCTest文件的特性:

2.2.1 tip

  • 1.整个工程中应该有多个XCTest文件,每一个XCTests都是只有.m文件的,继承自XCTestCase(当然如果你有公共配置,其实可以先新建继承自XCTestCase类的一个Cocoa Touch Class类比如说SQYBaseTestCase类,当作自己的XCTest所有类的父类,然后对于测试的基本配置/公用方法都可以在这个父类中实现啦~其他子类文件可以直接继承自SQYBaseTestCase类就可以直接调用公有方法了)
  • 2.每个XCTests.m文件中,必然包含一个setUp方法和一个tearDown方法
  • 3.每个单元测试方法执行之前,XCTest会先执行setUp方法,所以我们可以在这个方法中进行初始化参数或测试环境的配置
  • 4.每个单元测试方法执行结束后,XCTest会执行tearDown方法,所以可以把需要测试完成后销毁的内容逻辑放在这里,以便保证下面的测试不受本次测试影响
  • 5.每个单元测试方法都应该以test开头(如上张图所示[Hey])

2.2.2 怎样执行测试用例?

执行测试用例

如上图所示,你可以选择点击图标运行某一个测试用例方法,或者运行整个测试类,执行结果会通过不同的图标进行标注。

2.2.3 测试用例代码书写需要注意的点

在我们书写测试用例代码时

  • 你可以使用XCTAssert断言来帮助你更好的书写测试代码

  • XCTest的测试包中的文件路径
    不能通过[NSBundle mainBundle]来访问,因为UnitTest的路径不是你的应用程序的路径,所以应该使用以下命令来访问tip

      NSString *path = [[NSBundle bundleForClass:[myClass class]] pathForResource:name ofType:@"png"];
    
  • 有些需要测试的方法可能会执行异步网络操作,也许并不能立即返回服务器响应的结果,这就需要我们考虑实现异步操作的单元测试,而XCTestCase内置支持测试异步方法
    【1】使用expectationWithDescription:方法获取XCTestExpectation的实例,在这一模式下,测试完成的方法并不会被标记为测试用例通过。
    【2】使用waitForExpectationsWithTimeout:handler:方法来等待操作完成,如果测试用例没有完成,那么将会调用回调处理的块。
    【3】XCTestExpectation为fulfilled状态的话代表异步操作已经完成,可以检测是否符合预期。

3.单元测试的覆盖率

在自动化单元测试或功能测试中,经常使用代码覆盖率用来表示经过测试的代码的百分比,以保证我们的代码能够经过足够的测试。
我们可以开通xcode的代码覆盖收集


选择收集覆盖代码

开通后就可以在导航栏的报告导航栏中看到测试记录及结果,还可以选择点击➡️跳转到测试代码处,还可以点击Coverage或者Logs标签查看覆盖代码和测试日志


查看结果

但是测试用例的覆盖率是多高才合适呢?个人认为100%并不好,因为如果一个函数只是简单地实现了类似变量自增功能,而你依旧写了测试用例去测试该函数,那么对于测试用例编写的时间和精力反而比花费在开发上的还多反而得不偿失,同时也会大大增加代码量,造成逻辑混乱。所以应该谨慎的使用测试用例。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容