當我們從Xcode project 當中建立一個test target 之後,可以選擇建立UI Test Case Class 或是Unit TestCase Class,其中兩者皆繼承自XCTestCase,之間有著些許的設定差異,如:Unit TestCase Class 預設狀況下,若一個test method 有兩個以上的Assert ,若第一個Assert 失敗的話,後者將不會繼續執行,Unit Test Case Class 的預設值則不另外改變(*註1)。

XCTestCase 由數個test method 所組成,組成一個defaultTestSuite,而該類別為XCTestSuite 。

在我們執行測試時,defaultTestSuite 是按照alphabetic 來進行排序的,若要改變其test method 的執行順序,則要透過override defaultTestSuite method 來達成。

+ (XCTestSuite *)defaultTestSuite {
    XCTestSuite *customOrderTestSuite = [XCTestSuite testSuiteWithName:NSStringFromClass(self)];
    
    [customOrderTestSuite addTest:[self testCaseWithSelector:@selector(testA)]];
    [customOrderTestSuite addTest:[self testCaseWithSelector:@selector(testB)]];
    
    return customOrderTestSuite;
}

如此一來,當測試執行時,將會改變test method 的執行方式,按照加入的順序來執行,用於UI Test 時相當有用,可以有效的解決相依問題,當然,test method 之間彼此相依並不是一個好的寫法,但在於沒辦法解決test method 之間的相依性時,這或許是最好的解決方法。

 

註1:當然,也可以直接透過改變XCTestCase 的 continueAfterFailure property 來修改這個設定值。

 

Reference :

XCTestCase official document :https://developer.apple.com/reference/xctest/xctestcase?language=objc