一、什么是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