iOS单元测试

Unit Test简介

单元测试,通常一个单元指的就是应用程序中可以测试的最小单元,xCode5在创建工程的时候就会自带一个单元测试的文件夹,IDE自动生成了一个实现XCTestCase的.m文件,里面有一个失败测试(早期版本中实现的是SenTestCase,是苹果集成的第三方的,现在苹果建议使用新的XCTestCase)

Unit Test使用

1、 在创建工程的时候,会有是否创建测试文件夹的选项


iOS单元测试_第1张图片
Snip20161109_5.png

2、 进入工程目录,单元测试文件夹里,有默认创建好的测试文件


iOS单元测试_第2张图片
Snip20161109_6.png

iOS单元测试_第3张图片
Snip20161109_7.png

当然,我们也可以自己创建测试文件,xCode会自动把它放在同名的文件夹下
iOS单元测试_第4张图片
Snip20161109_8.png

3、 如何进行测试呢?可以选择运行测试文件,也可以选择只运行某个测试用例即方法,当然实际运行过程中,单元测试是在主线程中进行的,也就是启动app完成后进行


iOS单元测试_第5张图片
屏幕快照 2016-11-09 下午12.41.48.png

iOS单元测试_第6张图片
屏幕快照 2016-11-09 下午1.06.18.png

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没有这些库,所以要配置一下
iOS单元测试_第7张图片
1306128-119ee1f0f17dcffb.gif

iOS单元测试_第8张图片
1306128-e298d476bd2553e1.gif

另外,比如要进行网络请求,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  //暂停
}

你可能感兴趣的:(iOS单元测试)