Xcode单元测试
Xcode 6 的发布给我们带来了诸多新特性,譬如时下最火的swift,即时显示的playground,增强的interface builder支持实时渲染等等。今儿来看看Xcode 6 更新的但是少有重视的XCTest框架,此框架现已扩展为支持性能测试。
关于iOS项目测试
测试是开发质量的保证,Xcode自4.x以来就集成了自己的测试框架OCUnit,参考 iOS开发中的单元测试(一)&(二) ,发展到5时代,你会发现已经有一个默认的XCTest框架,直到现在...XCTest越来越强大。
XCTest框架
当一个新的iOS app在Xcode中建立,最终工程文件将会通过两个顶级组来配置(除“Products”组之外):"AppName" & "AppNameTests"。在AppNameTests中,其包括一个exampleXCTestCase类,由样式模板setUp & tearDown方法组成,还包括一个功能和性能测试的示例。
注:原文此处配有一张 Xcode 工程目录截图,展示 AppName / AppNameTests 两个顶级分组的关系。该图片在迁移前的备份中已经丢失,所以这里只保留文字描述:
一个新建的 iOS app 在 Xcode 中包含两个顶级组(
AppName、AppNameTests),后者包含 example XCTestCase 类与一组功能 / 性能测试示例。
XCTestCase
Xcode单元测试包含在一个XCTestCase的子类中。依据约束,每一个XCTestCase子类封装一个特殊的有关联的集合,例如一个功能、用例或者一个程序流。
setUp & tearDown
setUp在XCTestCase中的每一个测试运行前调用,tearDown在测试运行结束时被调用
功能测试
每一个名字以test开始的方法被标示用来测试,并且将会评估函数中的所有断言来决定是否通过或者失败。
XCTest内建的断言
基础性测试
为了整体精简,所有的XCTest断言缩小为一个独立的、基础的断言:
XCTAssert(expression,format...)
如果以上表达式判断为真,测试将会通过。否则,测试失败,将会打印格式化的消息。
布尔测试
布尔值或者简单的布尔表达式使用XCTAssertTrue & XCTAssertFalse:
XCTAssert等于XCTAssertTrue
相等性测试
当要测试两个值是否相等时使用XCTAssert[Not]Equal:
XCTAssertEqual(expression1,expression2,format...)
XCTAssertNotEqual(expression1,expression2,format...)
当指定测试两个双精度,单精度,或者其他浮点值是否相等,使用XCTAssert[Not]EqualWithAccuracy来报告浮点精度问题。
XCTAssertEqualWithAccuracy(expression1,expression2,accuracy,format...)
XCTAssertNotEqualWithAccuracy(expression1,expression2,accuracy,format...)
除了前面提到的相等断言,还有XCTAssertGreaterThan[OrEqual] & XCTAssertLessThan[OrEqual]提供了==,>,>=,<,<=比较运算符
空值测试
使用XCTAssert[Not]Nil断言一个给定的值是否存在(或者不存在):
XCTAssertNil(expression,format...)
XCTAssertNotNil(expression,format...)
无条件失败
最终,XCTFail断言将会总是失败
XCTFail(format...)
XCTFail通常用来为一个将会被通过的测试指代一个占位符。
性能测试
Xcode 6 的新特性能够检测代码性能:
-(void)testPerformanceExample{
//This is an example of a performance test case.
[self measureBlock:^{
//put the code you want to measure the time of here
}];
}
XCTestExpectation
Xcode 6 中新增的对于异步测试的支持
-(void)testAsyn{
//设置期望值
exp = [self expectationWithDescription:@"oh my god!"];
//指定一个超时,如果测试条件不适合时间范围便会结束执行
[self waitForExpectationsWithTimeout:10 handler:^(NSError *error){
//your code
}];
}
//异步回调的方法
-(void)methodAsyn{
[exp fulfill];
}