Unit Test简介
单元测试,通常一个单元指的就是应用程序中可以测试的最小单元,xCode5在创建工程的时候就会自带一个单元测试的文件夹,IDE自动生成了一个实现XCTestCase的.m文件,里面有一个失败测试(早期版本中实现的是SenTestCase,是苹果集成的第三方的,现在苹果建议使用新的XCTestCase)
Unit Test使用
1、 在创建工程的时候,会有是否创建测试文件夹的选项
2、 进入工程目录,单元测试文件夹里,有默认创建好的测试文件
当然,我们也可以自己创建测试文件,xCode会自动把它放在同名的文件夹下
3、 如何进行测试呢?可以选择运行测试文件,也可以选择只运行某个测试用例即方法,当然实际运行过程中,单元测试是在主线程中进行的,也就是启动app完成后进行
4、测试文件的内容
- 相关函数
- (void)setUp {
[super setUp];
// 测试函数执行前调用.
// In UI tests it is usually best to stop immediately when a failure occurs.
self.continueAfterFailure = NO;
// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
[[[XCUIApplication alloc] init] launch];
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}
- (void)tearDown {
// 测试函数执行后调用.
[super tearDown];
}
//测试函数
- (void)testExample {
// Use recording to get started writing UI tests.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
测试函数
1、测试函数的要求是:1.必须无返回值;2.以test开头;
2、测试函数执行的顺序:以函数名中test后面的字符大小有关,比如 -(void)test001XXX会先于-(void)test002XXX执行;XCTest框架中的断言
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语言标量、结构体或联合体时使用,实际测试发现NSString也可以);
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没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
进阶
- 单元测试涉及到真实开发,会需要很多第三方框架,如AFNetworking,这个时候单元测试的target没有这些库,所以要配置一下
另外,比如要进行网络请求,https的问题,在Info.plist中添加NSAppTransportSecurity类型Dictionary。 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES。
总之,要测试实际工程里的功能,就需要和工程target同样的环境和资源,需要什么找什么就好了
- iOS9的http安全问题:现在进行异步请求的网络测试,由于测试方法主线程执行完就会结束,所以需要设置一下,否则没法查看异步返回结果。在方法结束前设置等待,调回回来的时候再让它继续执行。
#define WAIT do{\
[self expectationForNotification:@"RSBaseTest" object:nil handler:nil];\
[self waitForExpectationsWithTimeout:30 handler:nil];\
}while(0);
#define NOTIFY \
[[NSNotificationCenter defaultCenter] postNotificationName:@"RSBaseTest" object:nil];
使用
-(void)testRequest{
// 1.获得请求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",nil];
// 2.发送GET请求
[mgr GET:@"http://www.weather.com.cn/adat/sk/101110101.html" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"responseObject:%@",responseObject);
XCTAssertNotNil(responseObject, @"返回出错");
NOTIFY //继续执行
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error:%@",error);
XCTAssertNil(error, @"请求出错");
NOTIFY //继续执行
}];
WAIT //暂停
}