NSMutableDictionary * dict = [[NSJSONSerialization JSONObjectWithData: [json dataUsingEncoding: NSUTF8StringEncoding] options: kNilOptions error: nil] mutableCopy];
LXDTestsModel * model = [[LXDTestsModel alloc] initWithDictionary: dict];
XCTAssertNotNil(model);
XCTAssertTrue([model.name isEqualToString: @"SindriLin"]);
XCTAssertTrue([model.age isEqual: @(22)]);
XCTAssertEqual(model.flags, 987654321);
XCTAssertTrue([model isKindOfClass: [LXDTestsModel class]]);
model = [LXDTestsModel modelWithName: @"Tessie" age: dict[@"age"] flags: 562525];
XCTAssertNotNil(model);
XCTAssertTrue([model.name isEqualToString: @"Tessie"]);
XCTAssertTrue([model.age isEqual: dict[@"age"]]);
XCTAssertEqual(model.flags, 562525);
NSDictionary * modelJSON = [model modelToDictionary];
XCTAssertTrue([modelJSON isEqual: dict] == NO);
dict[@"name"] = @"Tessie";
dict[@"flags"] = @(562525);
XCTAssertTrue([modelJSON isEqual: dict]);
}
邏輯測試的目的是為了檢測在代碼執行前后發生的變化是否符合預期,因此可以說80%左右的單元測試都是邏輯測試。最開始筆者學習單元測試的時候總有一種無從下手的感覺,但是當你從無形抽象的邏輯操作找到了數據變化的規律的時候,對應的單元測試就能很快的寫出來了。
相較于上面的邏輯測試,性能測試的地位有些尷尬。在現今的開發環境下,我們已經能通過 instrument工具很好的查找到項目中的代碼耗時點,性能測試就有種棄之可惜,食之無味的感覺了。但是為了本文的完整性,還是將這個補充完畢。筆者在測試model類中添加了類方法,用來隨機生成100個類實例對象,并且在每次創建對象后讓線程休眠一段時間來模擬耗時操作:
+ (NSArray
*)randomModels
{
NSMutableArray * models = @[].mutableCopy;
NSArray * names = @[
@"SindriLin", @"Bison", @"XiongZengHui", @"ZengChengChun", @"Tessie"
];
NSArray * ages = @[
@15, @20, @25, @30, @35
];
NSArray * flags = @[
@123, @456, @789, @012, @234
];
for (NSUInteger idx = 0; idx < 100; idx++) {
LXDTestsModel * model = [LXDTestsModel modelWithName: names[arc4random() % names.count] age: ages[arc4random() % ages.count] flags: [flags[arc4random() % flags.count] unsignedIntegerValue]];
[models addObject: model];
[NSThread sleepForTimeInterval: 0.01];
}
return models;
}
運行測試用法后控制臺會輸出下面的信息,其中紅框中表示執行代碼總耗時,在此demo中總共運行了11.015秒的時長
性能測試輸出
雖然性能測試的定位確實有些雞肋,但是另一方面,直接使用單元測試來獲取某段代碼的執行時間要比使用instrument快的多。通過性能測試直觀的獲取執行時間后,我們可以根據需要來決定是否將這些代碼放到子線程中執行來優化代碼(很多時候,數據轉換會占用大量的CPU計算資源)
異步測試
由于單元測試是在主線程中進行的,因此異步操作的測試在執行完畢之前,往往已經結束了。為了實現異步測試,筆者采用while()的方式無限循環等待,為了實現這個效果,我在LXDTestsModel頭文件中添加了一個NSData類型的屬性以及一個異步操作的接口方法,通過判斷這個屬性值來實現效果:
- (void)asyncConvertToData
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSDictionary * modelJSON = nil;
for (NSInteger idx = 0; idx < 20; idx++) {
modelJSON = [self modelToDictionary];
[self setValuesWithDictionary: modelJSON];
[NSThread sleepForTimeInterval: 0.001];
}
_data = [NSJSONSerialization dataWithJSONObject: modelJSON options: NSJSONWritingPrettyPrinted error: nil];
});
}
上面的代碼在系統創建的默認等級的子線程中執行了一段耗時代碼,最后把json轉換成NSData數據保存在自身的屬性中。對應的異步測試代碼如下:
原文轉自: http://www.cocoachina.com/ios/20160607/16612.html