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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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