iOS 單元測試--異步測試

單元測試分為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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容