iOS UnitTest简单应用

一、什么是UnitTest

在Xcode的API中这样描写:

The XCTest framework enables you to write unit tests for your Xcode projects that integrate seamlessly with the Xcode testing workflow, as described in Testing with Xcode.

Tests assert that certain conditions are satisfied during test execution, and record test failures (with optional messages) if those conditions are not satisfied. Tests can also measure the performance of blocks of code to check for performance regressions, and can interact with an application's UI to validate user interaction flows.

总结来说就是针对代码模块:1、测试代码是否满足某些条件,如果不满足,则记录失败;2、测试代码模块性能(测试代码执行花费的时间);3、验证UI交互(这部分属于UITest暂且不讨论,实用性太差)

二、什么时候使用UnitTest

iOS UnitTest最大的好处是,我们可以不运行我们的工程而测试我们想要测试的代码,并且可以做到批量测试,对于APP来讲,我们可以就免去了多个页面的点击,以及覆盖问题。最明显的就是接口测试,我们可以可以做到一键测试所有接口(事实上并不是真的一键,我们还是需要配置每个需要测试的接口,但是一次配置,就可以做到一劳永逸)是否完好。在我们的接口改变,新增等情况下,我们不但需要对新增的接口测试,还需要查看老接口是否受影响的情况下,UnitTest就显示十分方便。

对于接口测试,属于我们前文所提到的“测试代码是否满足某些条件”,这个方法还可以检查我们的代码逻辑,譬如我们工程里有本地计算订单费用,积分等,都可以用这个思想进行测试。

测试代码模块性能:我们可以用以测试代码运行花费时间,block执行时间。当我们有下载需求,比如捕手中的二维码保存,可以大致打估出所需时间(不太实用,对下载最大影响还是网速)。

三、UnitTest的使用

1、创建

第一个方法是在创建工程时勾选Include Unit Test

或者在创建工程以后,再添加target

这时候,我们可以看到工程里多了一个Tests文件夹,里面包含一个一个Test文件,


这就是我们的unitTest文件,当然,我们也可以自己再创建多个,以此来区分测试不同的模块。

可以看到.m文件初始包含4个方法

1)setUp:所有测试方法执行之前都会执行这个方法,如果我们需要确定一个对象的方法,可现在这个方法里实例化对象。

2)tearDown:所有测试方法执行之后都会执行这个方法

3)testExample:一个测试用例,里面可以写测试代码,我们自己写测试方法,都以test开头,才会有自动执行

4)testPerformanceExample:里面的measureBlock内为性能测试,测试一段代码执行时常。

2、使用

我们先来看XCTest自带的断言:

XCTAssertNotNil(a1, format…) 当a1不为nil时成立

XCTAssert(expression, format...) 当expression结果为YES成立

XCTAssertTrue(expression, format...) 当expression结果为YES成立;

XCTAssertEqualObjects(a1, a2, format...) 判断相等,当[a1 isEqualTo: a2]返回YES的时候成立

XCTAssertEqual(a1, a2, format...) 当a1==a2返回YES时成立

XCTAssertNotEqual(a1, a2, format...) 当a1!=a2返回YES时成立

&&

XCTFail(format…) 生成一个失败的测试;

XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过;

XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;

XCTAssert(expression, format...)当expression求值为TRUE时通过;

XCTAssertTrue(expression, format...)当expression求值为TRUE时通过;

XCTAssertFalse(expression, format...)当expression求值为False时通过;

XCTAssertEqualObjects(a1, a2, format...)判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过;

XCTAssertNotEqualObjects(a1, a2, format...)判断不等,[a1 isEqual:a2]值为False时通过;

XCTAssertEqual(a1, a2, format...)判断相等(当a1和a2是 C语言标量、结构体或联合体时使用, 判断的是变量的地址,如果地址相同则返回TRUE,否则返回NO);

XCTAssertNotEqual(a1, a2, format...)判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);

XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/-accuracy)以内相等时通过测试;

XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试;

XCTAssertThrows(expression, format...)异常测试,当expression发生异常时通过;反之不通过;(很变态) XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;

XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;

XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试;

XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;

XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过

用一个XCTAssertTrue举例来说,可以看出这个函数是判断是否为真。比如我们做出XCTAssertTrue(3>5)的判断,为结果正确,测试会顺利通过,假如XCTAssertTrue(3>5),结果为假,便会报错,并展示我们所添加说明。我们可以写一段代码测试一下:

在以test开头的方法左边,我们可以看到一个菱形的标志,点击就可以运行这段测试代码,也可以command + U执行所有测试代码,还可以如图所示,点击工程右边的执行键,或者模块的,或者指定方法的:




运行结果:

报错了,如果我们执行了所有测试代码,这时候我们可以在Xcode界面里看到所有的测试代码的运行加过,成功的会有对号,错误的会报错,错误的测试代码并会不影响其他的方法,这样我们可以方便的查看所有出问题的代码,如下图所示。

接着看上面这张图,可以看到我在setUp方法里,实例化了一个ViewController。我在ViewController写了一个简单的A-B求值的方法,我们可以写在XCTAssertTrue里测试:

我们接着看上面的大图,可以看到下面的testExample方法,我们进行了网络请求的测试。

在这里,测试方法是异步执行,我们可以设置期望,来设定我们期望的时间。

我们在创建expectation时,可以加入错误描述,比如我们这个网络请求,我在waitForExpectationsWithTimeout设置了时间为3,在expectationWithDescription设定的问题描述是超时,当我们的这个网络请求超过3秒钟,在waitForExpectationsWithTimeout就会报错,错误描述就会有我们的问题描述,在看我请求成功里写的,XCTAssertNotNil(responseObject, @“返回出错”),XCTAssertNotNil判断里面的对象不为nil,如果是nil则报错,展示返回错误。参考:XCTest的waitForExpectationsWithTimeout 方法

接下来我们看下面这个方法

描述为性能测试,我们可以把自己需要测试的方法放到block里,block里的代码,会执行10次,取出平均值,比如我们在这里打印1000次,点击旁边的菱形运行

我们可以看到,右边的测试结果展示了这段代码执行所用的时间,这是简单应用,我们可以测试ViewController的代码性能。

接下来点击左边的灰色菱形,在这里可以看到这十次执行的每次执行时间,


在这里我们点击set Baseline 可以设定我们的逾期,

比如我们设定逾期时间为 0.100S

然后执行这段代码,

可以看到,报错了,并且告诉我们,这段打码执行时间超出了我们超出的程度。

参考资料:http://blog.csdn.net/jeikerxiao/article/details/51668655

http://www.jianshu.com/p/d54428f574c3

http://www.jianshu.com/p/1a3772de126b

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 单元测试不是一个小工程,需要多用些时间才能做好,不要希望通过这个文章就能掌握单元测试,这只是一个入门,需要自己动手...
    勇不言弃92阅读 7,692评论 9 60
  • 前言 单元测试和UI测试大致步骤网上很多文章都有,如果会的可以忽略,关键是错误总结,网上很少有文章提及到,感兴趣的...
    _YGL_阅读 5,063评论 20 23
  • 一、概述 在Xcode中新建项目的时候会默认勾选单元测试,勾选后每个XCode新建的iOS的项目中都有一个叫做”项...
    kidd风阅读 2,357评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 【今日导读】 草铵膦产品供需延续紧张势头 11月重卡销售创同期历史新高 陕天然气拟定增募资发展主业 风电发展“十三...
    72e31abbfa15阅读 186评论 0 0