繼承XCTestCase,默認的方法有4個: 1. setUp(每個測試方法調用前執行, 在執行完父類方法后添加自定義配置); 2. tearDown(每個測試方法調用后執行,在執行父類方法前添加自定義配置); 3. textExample(一個示例); 4. testPerformanceExample(在measureBlock中放入需要測試性能的代碼)方法。
測試用例命名必須以test開頭,不可有參數且返回為void,不然無法識別為測試方法。測試用例類型有3種:普通測試,性能測試與異步測試。在后文中有詳細介紹
如果代碼未返回預測結果,則通過斷言API打印錯誤。
// 1. 普通測試- (void)testExample { // This is an example of a functional test case. // Use XCTAssert and related functions to verify your tests PRoduce the correct results. NSLog(@"testExample"); int a = 0; XCTAssertTrue(a == 0, "斷言a等于0,不等于則測試沒通過");}常用斷言如下所示(以下斷言含義from ios UnitTest 學習筆記):
// 常用斷言XCTAssert(expression, format...)當expression求值為TRUE時通過;XCTAssertTrue(expression, format...)當expression求值為TRUE時通過;XCTAssertFalse(expression, format...)當expression求值為False時通過;XCTAssertNil(a1, format...)為空判斷,a1為空時通過,反之不通過;XCTAssertNotNil(a1, format…)不為空判斷,a1不為空時通過,反之不通過;XCTAssertEqualObjects(a1, a2, format...)判斷相等,[a1 isEqual:a2]值為TRUE時通過,其中一個不為空時,不通過;XCTAssertNotEqualObjects(a1, a2, format...)判斷不等,[a1 isEqual:a2]值為False時通過,XCTAssertEqual(a1, a2, format...)判斷相等(當a1和a2是 C語言標量、結構體或聯合體時使用,實際測試發現NSString也可以);XCTAssertNotEqual(a1, a2, format...)判斷不等(當a1和a2是 C語言標量、結構體或聯合體時使用);XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判斷相等,(double或float類型)提供一個誤差范圍,當在誤差范圍(+/-accuracy)以內相等時通過測試;XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判斷不等,(double或float類型)提供一個誤差范圍,當在誤差范圍以內不等時通過測試;XCTAssertThrows(expression, format...)異常測試,當expression發生異常時通過;反之不通過;(很變態)XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)異常測試,當expression發生具體異常、具體異常名稱的異常時通過測試,反之不通過;XCTAssertNoThrow(expression, format…)異常測試,當expression沒有發生異常時通過測試;XCTAssertNoThrowSpecific(expression, specificException, format...)異常測試,當expression沒有發生具體異常、具體異常名稱的異常時通過測試,反之不通過;XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)異常測試,當expression沒有發生具體異常、具體異常名稱的異常時通過測試,反之不通過// 非常用斷言XCTFail(format…) 生成一個失敗的測試;XCTAssertThrowsSpecific(expression, specificException, format...) 異常測試,當expression發生specificException異常時通過;反之發生其他異常或不發生異常均不通過;ps: ?1. XCTAssert與XCTAssertTrue有什么區別
?2. XCTAssertEqualObjects和XCTAssertEqual有什么區別 [reply]XCTAssertEqualObjects(a1, a2, format…)的判斷條件是[a1 isEqual:a2]是否返回一個YES。XCTAssertEqual(a1, a2, format…)的判斷條件是a1 == a2是否返回一個YES,如果a1和a2都是基本數據類型變量,那么只有a1 == a2才會返回YES;如果a1和a2都是指針,那么只有a1和a2指向同一個對象才會返回YES。
定義一個或多個XCTestException(通過調用XCTestCase的expectationWithDescription:方法獲取XCTestExpection), 異步代碼執行完成調用XCTestException實例的fullfill方法通知異步測試滿足條件。然后再通過調用類中的waitForExceptionsWithTimeout:handler方法設置異步測試超時時間,并通過handler設置超時行為。
// 3.異步測試- (void)testRequest { XCTestExpectation *requestExpectation = [self expectationWithDescription:@"send request"]; AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr GET:@"https://baidu.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responSEObject) { NSLog(@"responseObject:%@", responseObject); XCTAssertNotNil(responseObject, @"返回錯誤"); [requestExpectation fulfill]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error:%@", error); XCTAssertNil(error, @"請求出錯"); [requestExpectation fulfill]; }]; [self waitForExpectationsWithTimeout:3.0 handler:^(NSError * _Nullable error) { if (error) { NSLog(@"Timeout Error:%@", error.description); } }];}Luis Solano在Objc.io的一篇文章中《Bad Testing Practices 》總結了自動化測試的五個好處: 1. 使重構更為簡單; 2. 避免代碼惡化; 3. 提供可執行的說明和文檔; 4. 減少創建軟件的時間; 5. 減少創建軟件的代價。 總的來說也可以通過Objc.io的另一篇文章《Real-World Testing with XCTest》中的一句話簡述: 測試使我們的代碼質量變的可靠,同時讓我們重構或修改代碼而不用擔心修改是否破壞了其他部分。
[官方文檔–Writing Test Classes and Methods] iOS 單元測試之XCTest詳解(一) ios UnitTest 學習筆記
新聞熱點
疑難解答