測試執行的流程
測試類和方法的執行是按照順序,one by one同步執行的.
執行測試的默認流程是,XCTest
會找到所有的測試類并逐一運行類里的所有測試方法.
當然也可以通過XCode的測試導航控制,只測試某個類或者方法.
對于繼承了XCTest
的測試類來說,測試會先執行setup
方法
- 對于每個測試方法來說,上個測試方法的實例對象會被銷毀,當前都會重新生成一個當前類的實例
每個測試方法都會先執行
setup
方法,在這之后,才會運行我們的測試方法,測試方法執行完成后,會運行teardown
方法所有測試方法的流程都是如上執行的
當類里面的最后一個測試方法執行完
teardown
對象方法后,XCode
會執行當前的類方法teardown
,然后開始測試下一個類該流程一直持續到所有的測試方法被測試過后.
寫測試方法
測試類中,添加測試方法,均為對象方法,且方法名以test開頭,無輸入參數和返回結果,舉例func testColorIsRed()
測試異步操作
測試是同步按順序one by one執行的,為了處理測試異步操作的情況,XCTest
在XCode 6之后提供了串行異步去執行測試方法,會在當前方法等待,直到異步方法執行完成或者超時.
如何測試異步方法,在異步方法完成之后才進行下一步操作呢?需要類XCTestExpectation
創建XCTestExpectation
實例,通過方法expectation(description:)
,一個測試方法里,可以有多個expectations,
創建expectation后,可以通過fullfill
標記異步操作的完成,或者通過waitForExpectationsWithTimeout : handler:
方法,進行一個超時時間的監聽.如果在超時時間過后,exception沒有被標記為完成,則測試失敗,進入timeout的回調.
下面是例子
// 測試異步操作
// 使用 XCTestCase的異步API監聽,直到異步操作完成
- (void)testDocumentOpening
{
// 創建expectation對象
// 下面的例子只有一個expectation, 但是在實際開發中,可以創建多個,并且會等待直到全部完成
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);
// 對結果進行判斷,進行處理或者拋出異常
// 結束當前的expectation,該操作會觸發 waitForExpectation 方法
[documentOpenExpectation fulfill];
}];
// 測試會暫時停止,直到超時或者expectation被完成
[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
[doc closeWithCompletionHandler:nil];
}];
}
巧用斷言
斷言的作用在于,當測試的結果不滿足需求時,通過斷言來宣布當前測試失敗,一個測試方法中可以有多個斷言,只要其中一個失敗,及視為測試失敗.斷言的使用非常簡單,系統提供了以下幾種類型
- 無條件失敗:
XCTFail(format...)
,該斷言會直接宣布測試失敗 - 等式失敗:
XCTAssertEqualObjects
等形式,不一一列舉,當等式不滿足時,宣布失敗 - 空值測試
-
XCTAssertNil
不為空時失敗 -
XCTAssertNotNil
為空時失敗
-
- 布爾測試
-
XCTAssertTrue(expression, format...)
不為ture時失敗 -
XCTAssertFalse(expression, format...)
不為false時失敗
-