前言:
本文章更像總結(jié)歸納,其中主要參考資料有:
風(fēng)之痕_ : http://m.itdecent.cn/p/f4ba532caed0
RasonWu:http://m.itdecent.cn/p/8bbec078cabe
CocoaChina: http://www.cocoachina.com/ios/20150702/12253.html
基礎(chǔ)介紹:
XCTestCase 這個類,衍生出兩個分支:單元測試(Unit Testing)和自動化測試UI自動測試(UnitTest UI)。這兩個測試類都是繼承于XCTestCase,都只有.m文件

創(chuàng)建完成后一些基本方法展示如下:

XCTestCase的常用斷言一覽
@property (nonatomic,assign) int condition1;
@property (nonatomic,assign) int condition2;
@property (nonatomic,assign) int condition3;
@property (nonatomic,strong) NSString *condition4;
//這里的斷言基本都以XCT開頭,末參數(shù)一定為報錯時展示的文字信息
//斷言,最基本的測試,第一個參數(shù)為真,則通過
XCTAssert(_condition1 == _condition2, @"測試過程中出現(xiàn)錯誤");
//bool測試中的true測試,首參數(shù)為真通過
XCTAssertTrue(_condition1 == _condition2,@"BOOL測試中的true測試出錯");
//bool測試中的false測試,首參數(shù)為假通過
XCTAssertFalse(_condition1 == _condition3,@"BOOL測試中的false測試出錯");
//相等測試,首參數(shù)與次參數(shù)相等通過
XCTAssertEqual(_condition1, _condition2,@"相等測試出錯");
//不相等測試,首參數(shù)與次參數(shù)不相等通過
XCTAssertNotEqual(_condition1, _condition3,@"不等測試出錯");
//針對loat或double比較,首參數(shù)與次參數(shù)的差,比第三參數(shù)的值小,通過
//大于測試
XCTAssertGreaterThan(_condition1, _condition3, @"大于測試出錯");
//大于等于測試
XCTAssertGreaterThanOrEqual(_condition1, _condition2, @"大于或等于測試出錯");
//相差測試,首參數(shù)與次參數(shù)的差,比第三參數(shù)的值小,通過
XCTAssertEqualWithAccuracy(0.6, 0.5, 0.11, @"相差測試結(jié)果比第三參數(shù)大");
//針對loat或double比較,首參數(shù)與次參數(shù)的差,比第三參數(shù)的值大,通過
XCTAssertNotEqualWithAccuracy(0.6, 0.5, 0.01, @"相差測試結(jié)果比第三參數(shù)小");
//首參數(shù)為nil,通過
XCTAssertNil(nil, @"nil測試");
//首參數(shù)不為nil,通過
XCTAssertNotNil(_condition4,@"非nil測試");
//無條件報錯
XCTFail(@"強制失敗");
異步測試
Unit Testing除了進行一般測試外還可以進行異步測試。邏輯是設(shè)置一個【期望】,然后在異步方法中執(zhí)行【期望滿足】。外部則設(shè)定一個時間限制來捕獲該【期望】。
//異步測試(期望測試)
- (void)testExpectation {
//聲明一個期望
XCTestExpectation *exp = [self expectationWithDescription:@"這里寫入操作出錯的原因描述。。。"];
//添加一個新線程
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperationWithBlock:^{
//模擬這個異步操作需要2秒后才能獲取結(jié)果,比如一個異步網(wǎng)絡(luò)請求
sleep(2);
//模擬獲取的異步操作后,獲取結(jié)果,判斷異步方法的結(jié)果是否正確
XCTAssertEqual(_condition1, _condition2,@"返回結(jié)果又問題");
//如果斷言沒問題,就調(diào)用fulfill宣布測試滿足期望
//注:如果你申明了多個期望,每個都需要fulfill
[exp fulfill];
}];
//延遲捕獲,3秒后未獲得滿足的期望,會報錯。這里修改為"1"就會報錯
[self waitForExpectationsWithTimeout:3 handler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"Timeout Error: %@", error);
}
}];
}
代碼覆蓋率測試
Unit Testing還可以測試代碼覆蓋率(代碼覆蓋率 = 實際執(zhí)行的代碼行數(shù) / 整個工程總代碼行數(shù))
如果某個類中代碼覆蓋率并不是100%,那么有可能類中存在冗余代碼,或者類中有方法被遺忘了,不管哪一種我們都應(yīng)該盡力解決它。
實現(xiàn)方法:
點擊product->scheme->Edit Scheme
進入編輯方案頁面

打開代碼覆蓋率計數(shù)功能(XCode關(guān)閉后會自動關(guān)閉)

以Test模式運行項目,快捷鍵commond+U
測試通過后,在Report Navigator窗口可以查看代碼覆蓋率

雙擊類或者方法,可以打開,查看具體方法的執(zhí)行情況。

XCTestCase與CocoaPods
如果在XCTestCase中使用CocoaPods的話,Pod中導(dǎo)入的庫在XCTestCase是不能直接使用的。
會發(fā)生找不到路徑的錯誤,需要進行如下配置
Podfile
platform :ios, '7.0'
pod 'AFNetworking', '~> 2.5.0'
pod 'STAlertView', '~> 1.0.0'
1.修改 TARGETS => XCTestCaseTests => Build Phases => Header Search Paths

2.修改 TARGETS => XCTestCaseTests => Build Phases => 新增 => PODS_ROOT

3.如果想使用Http地址進行網(wǎng)絡(luò)訪問
Info.plist => 添加 => NSAppTransportSecurity(類型Dictionary)。
NSAppTransportSecurity => NSAllowsArbitraryLoads(類型Boolean) =>設(shè)置值YES
4.如果想要在#import "xxxx" 中顯示你導(dǎo)入的第三方庫中類的名稱
采用如下方法(消耗一定內(nèi)存):

其中【$(SRCROOT)】可以再約束下成為更精準(zhǔn)的定位,今后再研究
成果展示:

另外:1、2兩步驟還有另外一種操作方式可以達到同樣效果

UnitTest UI測試
這個測試工具主要功能是自動執(zhí)行設(shè)置的UI操作流程,達到自動化測試的目的。對于一些邏輯復(fù)雜的調(diào)試情況十分有利。例子:登陸后填寫表單,測試表單中每一行測試缺失的報錯情況。
操作流程:

附錄:XCTest的三種UI測試對象
1.XCUIApplication 當(dāng)前測試應(yīng)用target
2.XCUIElementQuery 定位查詢當(dāng)前UI中xctuielement的一個類
3.XCUIElement UI測試中任何一個item項都被抽象成一個XCUIElement類型
出現(xiàn)過的問題:
問題一、"library not found for - xxxxxx"
問題原因:項目中使用pods,但xcode編譯時找不到目標(biāo)庫
解決方案:在Library Search Paths中指定缺失的路徑
注:我發(fā)生的情況Test缺失了Path路徑,所以直接從項目XCTestCase中把對應(yīng)的路徑拷貝到Test的Build Setting中就好了

資料:
http://m.itdecent.cn/p/f4ba532caed0
http://m.itdecent.cn/p/8bbec078cabe
http://www.cocoachina.com/ios/20150702/12253.html