單元測試分為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