IOS Unit Test

最簡單的單元測試
1.新建項目:

圖片.png

2.最簡單的測試,注意截圖路徑的問題
進入到這個類,setUp是每個測試方法調用前執行,tearDown是每個測試方法調用后執行。testExample是測試方法,和我們新建的沒有差別。不過測試方法必須testXXX的格式,且不能有參數,不然不會識別為測試方法。測試方法的執行順序是字典序排序。
按快捷鍵Command + U進行單元測試,這個快捷鍵是全部測試。
testExample方法中輸入

NSLog(@"自定義測試testExample");
   int  a= 3;
   XCTAssertTrue(a == 0,"a 不能等于 0");

點擊播放按鈕,開始單個方法的測試:

圖片.png

出現如下結果,由于我們斷言a是等于0的,而a等于3,所以測試沒有通過。當然有其它的,用到再看,demo里都有。

圖片.png

進行網絡請求的測試
使用CocoaPods安裝AFNetworking和STAlertView(CocoaPods安裝和使用教程 )
Pofile:

platform :ios, '7.0'
target 'UnitTestDemoTests' do
    pod 'AFNetworking', '~> 2.5.0'
    pod 'STAlertView', '~> 1.0.0'
end
target 'UnitTestDemoTestsTests' do
    pod 'AFNetworking', '~> 2.5.0'
    pod 'STAlertView', '~> 1.0.0'
end

iOS9的http安全問題:現在進行異步請求的網絡測試,由于測試方法主線程執行完就會結束,所以需要設置一下,否則沒法查看異步返回結果。在方法結束前設置等待,調回回來的時候再讓它繼續執行。(另一種異步函數的單元測試)定義宏如下:

//waitForExpectationsWithTimeout是等待時間,超過了就不再等待往下執行。
#define WAIT do {\
[self expectationForNotification:@"RSBaseTest" object:nil handler:nil];\
[self waitForExpectationsWithTimeout:30 handler:nil];\
} while (0);

#define NOTIFY \
[[NSNotificationCenter defaultCenter]postNotificationName:@"RSBaseTest" object:nil];

增加測試方法testRequest:

-(void)testRequest{
    // 1.獲得請求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",nil];

    // 2.發送GET請求
    [mgr GET:@"http://www.weather.com.cn/adat/sk/101110101.html" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"responseObject:%@",responseObject);
        XCTAssertNotNil(responseObject, @"返回出錯");
        NOTIFY //繼續執行
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"error:%@",error);
        XCTAssertNil(error, @"請求出錯");
        NOTIFY //繼續執行
    }];
    WAIT  //暫停
}

有時候我們想測試一下整個流程是否可以跑通,比如獲取驗證碼、登錄、上傳頭像,查詢個人資料。其實只要輸入驗證碼就可以完成整個測試。這時候就需要用到輸入框了,以便程序繼續執行。使用了一個第三方的彈出輸入框STAlertView,前面已經設置。
STAlertView的使用方法:

 self.stAlertView = [[STAlertView alloc]initWithTitle:@"驗證碼" message:nil textFieldHint:@"請輸入手機驗證碼" textFieldValue:nil cancelButtonTitle:@"取消" otherButtonTitle:@"確定" cancelButtonBlock:^{
            //點擊取消返回后執行
            [self testAlertViewCancel];
            NOTIFY //繼續執行
        } otherButtonBlock:^(NSString *b) {
            //點擊確定后執行
            [self alertViewComfirm:b];
             NOTIFY //繼續執行
        }];
        [self.stAlertView show];

3.性能測試
性能測試主要使用 measureBlock 方法 ,用于測試一組方法的執行時間,通過設置baseline(基準)和stddev(標準偏差)來判斷方法是否能通過性能測試。

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
          //Put the code you want to measure the time of here.
          //你的性能測試的代碼放在這里
    }];
}

4.命令行測試

測試不僅可以在xcode中執行,也可以在命令行中執行,這個便于代碼持續集成和構建,在git提交中也編譯檢查代碼

如果你有development-enabled設備插入,你可以按照名稱或 id 調用他們。例如,如果你有一個名為”Development iPod touch”的 iPod 設備連接了測試的代碼,可以使用下面的命令來測試代碼

> xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=iOS,name=Development iPod touch

測試也可以在 iOS模擬器上運行。使用模擬器可以應對不同的外形因素和操作系統版本。例如

 > xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone,0S=7.0'

-destination 參數可以被連接在一起,這樣你只需使用一個命令,就可以跨目標進行指定集成共享方案。例如,下面的命令把之前的三個例子合并到一個命令中

> xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp
-destination 'platform=OS X,arch=x86_64'
-destination 'platform=iOS,name=Development iPod touch'
-destination 'platform=iOS Simulator,name=iPhone,0S=7.0'

斷言種類:

//通用斷言
XCTAssert(expression, format...)
//常用斷言:
XCTAssertTrue(expression, format...)
XCTAssertFalse(expression, format...)
XCTAssertEqual(expression1, expression2, format...)
XCTAssertNotEqual(expression1, expression2, format...)
XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, format...)
XCTAssertNotEqualWithAccuracy(expression1, expression2, accuracy, format...)
XCTAssertNil(expression, format...)
XCTAssertNotNil(expression, format...)

XCTFail(format...) //直接Fail的斷言

注意點

都是血與淚的教訓

  • 使用pod的項目中,在XC測試框架中測試內容包括第三方包時,需要手動去設置Header Search Paths才能找到頭文件 ,還需要設置test target的PODS_ROOT.

  • Enable Testability 設置為YES

  • xcode7要使用真機做跑測試時,證書必須配對,否則會報錯exc_breakpoint錯誤

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容