測試執(zhí)行的流程
測試類和方法的執(zhí)行是按照順序,one by one同步執(zhí)行的.
執(zhí)行測試的默認(rèn)流程是,XCTest
會找到所有的測試類并逐一運(yùn)行類里的所有測試方法.
當(dāng)然也可以通過XCode的測試導(dǎo)航控制,只測試某個類或者方法.
對于繼承了XCTest
的測試類來說,測試會先執(zhí)行setup
方法
- 對于每個測試方法來說,上個測試方法的實例對象會被銷毀,當(dāng)前都會重新生成一個當(dāng)前類的實例
每個測試方法都會先執(zhí)行
setup
方法,在這之后,才會運(yùn)行我們的測試方法,測試方法執(zhí)行完成后,會運(yùn)行teardown
方法所有測試方法的流程都是如上執(zhí)行的
當(dāng)類里面的最后一個測試方法執(zhí)行完
teardown
對象方法后,XCode
會執(zhí)行當(dāng)前的類方法teardown
,然后開始測試下一個類該流程一直持續(xù)到所有的測試方法被測試過后.
寫測試方法
測試類中,添加測試方法,均為對象方法,且方法名以test開頭,無輸入?yún)?shù)和返回結(jié)果,舉例func testColorIsRed()
測試異步操作
測試是同步按順序one by one執(zhí)行的,為了處理測試異步操作的情況,XCTest
在XCode 6之后提供了串行異步去執(zhí)行測試方法,會在當(dāng)前方法等待,直到異步方法執(zhí)行完成或者超時.
如何測試異步方法,在異步方法完成之后才進(jìn)行下一步操作呢?需要類XCTestExpectation
創(chuàng)建XCTestExpectation
實例,通過方法expectation(description:)
,一個測試方法里,可以有多個expectations,
創(chuàng)建expectation后,可以通過fullfill
標(biāo)記異步操作的完成,或者通過waitForExpectationsWithTimeout : handler:
方法,進(jìn)行一個超時時間的監(jiān)聽.如果在超時時間過后,exception沒有被標(biāo)記為完成,則測試失敗,進(jìn)入timeout的回調(diào).
下面是例子
// 測試異步操作
// 使用 XCTestCase的異步API監(jiān)聽,直到異步操作完成
- (void)testDocumentOpening
{
// 創(chuàng)建expectation對象
// 下面的例子只有一個expectation, 但是在實際開發(fā)中,可以創(chuàng)建多個,并且會等待直到全部完成
XCTestExpectation *documentOpenExpectation = [self expectationWithDescription:@"document open"];
NSURL *URL = [[NSBundle bundleForClass:[self class]]
URLForResource:@"TestDocument" withExtension:@"mydoc"];
UIDocument *doc = [[UIDocument alloc] initWithFileURL:URL];
[doc openWithCompletionHandler:^(BOOL success) {
XCTAssert(success);
// 對結(jié)果進(jìn)行判斷,進(jìn)行處理或者拋出異常
// 結(jié)束當(dāng)前的expectation,該操作會觸發(fā) waitForExpectation 方法
[documentOpenExpectation fulfill];
}];
// 測試會暫時停止,直到超時或者expectation被完成
[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
[doc closeWithCompletionHandler:nil];
}];
}
巧用斷言
斷言的作用在于,當(dāng)測試的結(jié)果不滿足需求時,通過斷言來宣布當(dāng)前測試失敗,一個測試方法中可以有多個斷言,只要其中一個失敗,及視為測試失敗.斷言的使用非常簡單,系統(tǒng)提供了以下幾種類型
- 無條件失敗:
XCTFail(format...)
,該斷言會直接宣布測試失敗 - 等式失敗:
XCTAssertEqualObjects
等形式,不一一列舉,當(dāng)?shù)仁讲粷M足時,宣布失敗 - 空值測試
-
XCTAssertNil
不為空時失敗 -
XCTAssertNotNil
為空時失敗
-
- 布爾測試
-
XCTAssertTrue(expression, format...)
不為ture時失敗 -
XCTAssertFalse(expression, format...)
不為false時失敗
-