XCTestCase(智能測試化工具)

前言:

本文章更像總結(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文件


C877AC3D-C118-4D87-93E1-989B411810CE.png

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


81D4223D-AD8D-4742-80F8-F3B83CABB2B7.png

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
進入編輯方案頁面


1D0E6ACA-61E7-438F-9710-798722AB36EF.png

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


E5A6B8D3-387C-4086-93F9-6A4BCE043BBA.png

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


7EDD08A8-3B2C-4602-954A-AEC0817B937D.png

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


AD4DB30F-3BB7-4E66-9EA2-2F851C57B926.png

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


1306128-119ee1f0f17dcffb.gif

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


1306128-e298d476bd2553e1.gif

3.如果想使用Http地址進行網(wǎng)絡(luò)訪問
Info.plist => 添加 => NSAppTransportSecurity(類型Dictionary)。
NSAppTransportSecurity => NSAllowsArbitraryLoads(類型Boolean) =>設(shè)置值YES

4.如果想要在#import "xxxx" 中顯示你導(dǎo)入的第三方庫中類的名稱
采用如下方法(消耗一定內(nèi)存):


63CCC2DD-FD94-4D14-8534-4BAAC1F4846A.png

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

0F094A08-3CB9-42E8-A34D-214576FA7F2D.png

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

CF206FEB-D237-42D9-960C-C71C829365AD.png

UnitTest UI測試

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


0C5CF711-2223-4F65-881D-53FAD268512E.png

附錄: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中就好了

1F8C5EBD-F962-4213-9AF4-7444A38EF47C.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,374評論 25 708
  • layout: post title: "Xcode 7智能測試化工具XCTest學(xué)習(xí)" ...
    風(fēng)之痕_閱讀 22,839評論 14 101
  • 編寫測試可不是一項迷人的工作;然而,由于測試可以避免使你的寶貝應(yīng)用程序變成一塊充斥錯誤的大垃圾場,所以編寫測試又是...
    cosWriter閱讀 1,726評論 0 4
  • 秋水是凝望,凝望是眼眸里的傷,傷是淚里折射下的華光,華光是落寞的收場。 然后夕陽凄美了走廊,時間斑駁了圍墻,背影拉...
    趙清歡閱讀 467評論 0 0
  • 以前在學(xué)習(xí)Runtime,概念性東西太多,總是有種朦朧的感覺?,F(xiàn)在潛心研究Runtime。發(fā)現(xiàn)越深入了解,越能接觸...
    城市之光閱讀 534評論 2 0

友情鏈接更多精彩內(nèi)容