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 中包含两个顶级组(AppNameAppNameTests),后者包含 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];
}