iOS 单元测试--异步测试

作者: 爱自由鹏 | 来源:发表于2016-05-28 17:15 被阅读1802次

    单元测试分为3种:

    • 逻辑测试:测试逻辑方法
    • 异步测试:测试耗时方法(用来测试包含多线程的方法)
    • 性能测试:测试某一方法运行所消耗的时间

    本节在 iOS 单元测试--逻辑测试 这篇文章的基础上,来介绍异步测试。直接在已创建好的Person这个类里,增加一个模拟“异步加载个人数据”的网络请求数据方法:

    + (void)loadPersonAsync:(void(^)(Person *person))completion; //异步加载个人数据

    异步加载个人数据方法的单元测试.png

    Person.m文件:

    /** 异步加载个人记录 */
    + (void)loadPersonAsync:(void (^)(Person *))completion {
        
        // 异步 子线程执行
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            // 模拟网络延迟 2s
            [NSThread sleepForTimeInterval:2.0];
            
            Person *person = [Person personWithDict:@{@"name":@"zhang", @"age":@25}];
            
            // 回到主线程
            dispatch_async(dispatch_get_main_queue(), ^{
                if (completion != nil) {
                    completion(person);
                }
            });
        });
    }
    

    然后,切换到PersonTests.m,新建一个 - (void)testLoadPersonAsync{} 异步测试方法,然后Command+S保存,左边会出现菱形白色调试按钮。
    测试中,要用到系统提供的XCTestExpectation这个类,以及- (void)waitForExpectationsWithTimeout:(NSTimeInterval)timeout handler:(nullable XCWaitCompletionHandler)handler这个方法来测试,测试代码如下所示:

    调试的PersonTests.m文件:

    // 测试异步加载person
    - (void)testLoadPersonAsync {
        
        XCTestExpectation *expectation = [self expectationWithDescription:@"异步加载 Person"];
        
        [Person loadPersonAsync:^(Person *person) {
    //        NSLog(@"%@",person);
            
            XCTAssertNotNil(person.name, @"名字不能为空");
            XCTAssert(person.age > 0, @"年龄不正确");
            
            // 标注预期达成
            [expectation fulfill];
        }];
        
        // 等待 5s 期望预期达成
        [self waitForExpectationsWithTimeout:5 handler:nil];
    }
    

    最后,通过AFNetworking的单元测试可以看出,它就是这样来进行异步测试的,附一张截图,大家可以把AFNetworking下载下来,自己研究一下。

    AFNetworking的单元测试.png

    相关文章

      网友评论

      本文标题:iOS 单元测试--异步测试

      本文链接:https://www.haomeiwen.com/subject/ubwfdttx.html