美文网首页
iOS异步测试

iOS异步测试

作者: bomo | 来源:发表于2017-03-16 22:28 被阅读153次

简介

在iOS做单元测试的时候,写异步方法的时候是比较恶心的,系统提供的API简直不能忍,先看一下

//1. 设置一个Expectation
XCTestExpectation *expectation = [self expectationWithDescription:@"testSomeThing"];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // 3. 异步操作在3秒后完成,完成后调用fulfill,而等待的方法则继续运行");
    [expectation fulfill];
});

//2. 等待Expectation结束,超过超时时间则测试失败
[self waitForExpectationsWithTimeout:30 handler:nil];

用法

系统提供的API太过于简陋,有时候我们不希望超时的时候就立即停止测试,而是可以获取是否超时的结果,或者提供一些重试的机制,在这里封装了几个异步方法,基于MainRunLoop,提供重试机制,通过扩展XCTestCase实现,可以通过Pod导入

pod 'XCTestCaseAsync'

具体代码见后面链接,先看看用法

  1. 异步测试
//1. wait with a async block
[self waitWithAsync:^(FinishBlock  _Nonnull complete) {
    // async method
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // set finish flag, finish async
        complete();
    });
}];
  1. 超时测试
//2. timeout
BOOL success = [self waitWithTimeout:3 asyncBlock:^(FinishBlock  _Nonnull complete) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(15 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        complete();
    });
}];
if (success) {
    NSLog(@"block execute success");
} else {
    NSLog(@"timeout");
}
  1. 重试
//3. retry
BOOL success = [self waitWithRetryTimes:3 asyncBlock:^(CompleteBlock  _Nonnull complete) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{        
        NSLog(@"failure");
        complete(NO);
    });
}];
if (success) {
    NSLog(@"block execute success");
} else {
    NSLog(@"block execute fail after retry");
}
  1. swift版本如下
// 1. async test
self.wait { (complete) in
    let delay = DispatchTime.now() + .seconds(1)
    DispatchQueue.main.asyncAfter(deadline: delay, execute: {
        complete()
    })
}

// 2. timeout test
let success = self.wait(withTimeout: 3) { (complete) in
    let delay = DispatchTime.now() + .seconds(5)
    DispatchQueue.main.asyncAfter(deadline: delay, execute: {
        complete()
    })
}

// 3. retry test
let success = self.wait(withRetryTimes: 3) { (complete) in
    let delay = DispatchTime.now() + .seconds(1)
    DispatchQueue.main.asyncAfter(deadline: delay, execute: {    
        print("failure")
        complete(false);
    })
}

代码

详细代码见这里

相关文章

  • iOS单元测试

    参考博客:iOS单元测试概念了解iOS异步测试Xcode:为你的项目集成单元测试(unit tests)时记得避开...

  • iOS异步测试

    简介 在iOS做单元测试的时候,写异步方法的时候是比较恶心的,系统提供的API简直不能忍,先看一下 用法 系统提供...

  • iOS 单元测试--异步测试

    1、如果是后面添加的UnitTest的话需要按照下面的方法进行设置 1.复制Target(App) - Build...

  • iOS 单元测试--异步测试

    单元测试分为3种: 逻辑测试:测试逻辑方法 异步测试:测试耗时方法(用来测试包含多线程的方法) 性能测试:测试某一...

  • OKHTTP

    OKHTTP 引用 权限配置 测试URL 同步请求 异步请求 异步get请求 异步测试post请求 Retrofi...

  • IOS XCTest使用异步测试

    XCTest使用异步测试需要用到XCTestExpectation这个类, 首先在测试方法中创建一个XCTestE...

  • iOS 图形异步绘制圆角

    iOS 图形异步绘制圆角

  • Android Junit 单元测试、异步测试方法简介及异步测试

    Android Junit 单元测试、异步测试方法简介及异步测试框架指南 本文解决的问题 1. 如何使用junit...

  • Jest测试异步代码

    JavaScript中经常有异步运行的代码。如果你要测试异步的代码,Jest需要知道他测试的代码是否已经完成异步动...

  • 单元测试--异步

    用unit test测试异步线程时。有个问题,就是当主线程走完,测试就结束了,连同异步的计算或网络。不会等到异步出...

网友评论

      本文标题:iOS异步测试

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