iOS单元测试之XCTest

Unit Test,单元测试,顾名思义就是对最小单元进行测试。

XCTest,Xcode5中新加入的测试框架,被寄希望来替换Xcode2.1开始的OCUint。

新建XCTest都要继承自XCTestCase类。为统一代码风格,Test类后缀一般用”Tests”。测试函数名一定要用前缀”test”,否则测试时不会被执行。

取消测试某个函数的时候可以在原函数加”DISABLED”前缀,但貌似这么做只是为了风格统一。实际上只要不是”test”开头系统就不会测试这个函数了。

需要注意的是Tests类并没有常规的生命周期,没有初始化函数那些。但是有两个功能接近的函数,setUp()跟tearDown()。setUp()函数会在本Tests类的test函数执行前调用,可以用作初始化函数,对变量初始化或赋值。tearDown()函数会在本Tests类的test函数执行后调用,可以对变量进行释放等操作。

断言(XCTAssert)

在”command+u”开始测试时还要编写一些测试代码。这时候XCTAssert断言就上场了。关于断言可以参考这篇文章:iOS UnitTest学习笔记

断言一般都要进行非空、等于测试。

如下代码为一个简单的断言测试:

1
2
3
NSString *version = @"1.0";
NSString *mVersion = [Util versionName];
XCTAssertEqualObjects(mVersion, version,@"not equal");

性能测试

XCTest还支持性能测试,如下示例:

1
2
3
4
__block WebVCtler *vc = nil;
[self measureBlock:^{
vc = [WebVCtler new];
}];

进行性能测试后,会打印出一些相关的数据信息,如执行时间、STDDEV等。

异常测试(异步测试)

异常测试就是找异常。

如下一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-(void)testOperationGet{
NSString *url = @"http://baike.baidu.com/api/openapi/BaikeLemmaCardApi";
NSDictionary *params = @{@"scope":@"103",
@"format":@"json",
@"appid":@"379020",
@"bk_key":@"关键字",
@"bk_length":@"600"};
XCTestExpectation *expectation = [self expectationWithDescription:@"Handler called"];
[[NetWorkCenter sharedInstance]GET:url parameters:params success:^(HTTPRequestOperation *operation ,id responseObject){
NSLog(@"operation:%@,responseObject:%@",operation,responseObject);
// [expectation fulfill];
}failure:^(HTTPRequestOperation *operation ,NSError *error){
[expectation fulfill];
}];

[self waitForExpectationsWithTimeout:5 handler:nil];
}

首先创建一个exception,然后在我们认为会发生异常的地方调用fulfill,最后设置超时时间为5秒,如果5秒内调用了fulfill即发生了预期异常,测异常测试通过。如果5秒内未调用fulfill,则测试不通过。((:з」∠) 其实就是找异常游戏)

Mock

mock似乎也可以叫虚拟测试,因为作用就是虚拟其他对象。

我们要用到OCMock这个开源的测试框架。官网为:http://ocmock.orgGitHub地址:https://github.com/erikdoe/ocmock

关于详细的Mock介绍可以参考这篇博客:Xcode 5 单元测试(二)OCMock和GHUnit

还有一篇更加全面的ObjC中国的大神文章:XCTest 测试实战