iOS單元測(cè)試(作用及入門提升)

由于只是一些簡(jiǎn)單實(shí)用的東西,學(xué)學(xué)還是挺不錯(cuò)的。其實(shí)單元測(cè)試用的好,開發(fā)起來也會(huì)快很多。單元測(cè)試對(duì)于我目前來說,就是為了方便測(cè)試一些功能是否正常運(yùn)行,還有調(diào)試接口是否能正常使用。有時(shí)候你可能是為了測(cè)試某一個(gè)網(wǎng)絡(luò)接口,然后每次都重新啟動(dòng)并且經(jīng)過很多操作之后才測(cè)試到了那個(gè)網(wǎng)絡(luò)接口。如果使用了單元測(cè)試,就可以直接測(cè)試那個(gè)方法,相對(duì)方便很多。 比如由于修改較多,我們想測(cè)試一下分享功能是否正常,這時(shí)候就有用了。(而不是重新啟動(dòng)程序,進(jìn)入到分享界面,點(diǎn)擊分享,填寫分享內(nèi)容。)其實(shí)單元測(cè)試并沒有降低我們打代碼的效率,我們可以在單元測(cè)試通過了,直接用到相應(yīng)的地方。
當(dāng)然也有一些高級(jí)的作用,比如自動(dòng)發(fā)布、自動(dòng)測(cè)試(特別在一些大的項(xiàng)目,以防止程序被誤改或引起新的問題)。
現(xiàn)在,讓我們先理清一下單元測(cè)試到底有些什么東西?
OCUnit即用XCTest進(jìn)行測(cè)試)其實(shí)就是蘋果自帶的測(cè)試框架,我們主要講的就是這個(gè)。GHUnit是一個(gè)可視化的測(cè)試框架。(有了它,你可以點(diǎn)擊APP來決定測(cè)試哪個(gè)方法,并且可以點(diǎn)擊查看測(cè)試結(jié)果等。)OCMock就是模擬某個(gè)方法或者屬性的返回值,你可能會(huì)疑惑為什么要這樣做?使用用模型生成的模型對(duì)象,再傳進(jìn)去不就可以了?答案是可以的,但是有特殊的情況。比如你測(cè)試的是方法A,方法A里面調(diào)用到了方法B,而且方法B是有參數(shù)傳入,但又不是方法A所提供。這時(shí)候,你可以使用OCMock來模擬方法B返回的值。(在不影響測(cè)試的情況下,就可以這樣去模擬。)除了這些,在沒有網(wǎng)絡(luò)的情況下,也可以通過OCMock模擬返回的數(shù)據(jù)。UITests就是通過代碼化來實(shí)現(xiàn)自動(dòng)點(diǎn)擊界面,輸入文字等功能。靠人工操作的方式來覆蓋所有測(cè)試用例是非常困難的,尤其是加入新功能以后,舊的功能也要重新測(cè)試一遍,這導(dǎo)致了測(cè)試需要花非常多的時(shí)間來進(jìn)行回歸測(cè)試,這里產(chǎn)生了大量重復(fù)的工作,而這些重復(fù)的工作有些是可以自動(dòng)完成的,這時(shí)候UITests就可以幫助解決這個(gè)問題了。

最簡(jiǎn)單的單元測(cè)試

1.新建項(xiàng)目:

18CA997F-4911-4B99-9A83-2AB44A77E8E8.png

2.最簡(jiǎn)單的測(cè)試,注意截圖路徑的問題
進(jìn)入到這個(gè)類,setUp是每個(gè)測(cè)試方法調(diào)用執(zhí)行,tearDown是每個(gè)測(cè)試方法調(diào)用執(zhí)行。testExample是測(cè)試方法,和我們新建的沒有差別。不過測(cè)試方法必須testXXX的格式,且不能有參數(shù),不然不會(huì)識(shí)別為測(cè)試方法。測(cè)試方法的執(zhí)行順序是字典序排序。
按快捷鍵Command + U進(jìn)行單元測(cè)試,這個(gè)快捷鍵是全部測(cè)試。
testExample方法中輸入

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

點(diǎn)擊播放按鈕,開始單個(gè)方法的測(cè)試:

8F503AA4-C630-419A-9F66-C779C81A5581.png

出現(xiàn)如下結(jié)果,由于我們斷言a是等于0的,而a等于3,所以測(cè)試沒有通過。當(dāng)然有其它的,用到再看,demo里都有。


圖片.png
進(jìn)行網(wǎng)絡(luò)請(qǐng)求的測(cè)試

使用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安全問題:現(xiàn)在進(jìn)行異步請(qǐng)求的網(wǎng)絡(luò)測(cè)試,由于測(cè)試方法主線程執(zhí)行完就會(huì)結(jié)束,所以需要設(shè)置一下,否則沒法查看異步返回結(jié)果。在方法結(jié)束前設(shè)置等待,調(diào)回回來的時(shí)候再讓它繼續(xù)執(zhí)行。(另一種異步函數(shù)的單元測(cè)試)定義宏如下:

//waitForExpectationsWithTimeout是等待時(shí)間,超過了就不再等待往下執(zhí)行。
#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];

增加測(cè)試方法testRequest:

-(void)testRequest{
    // 1.獲得請(qǐng)求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",nil];
    
    // 2.發(fā)送GET請(qǐng)求
    [mgr GET:@"http://www.weather.com.cn/adat/sk/101110101.html" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"responseObject:%@",responseObject);
        XCTAssertNotNil(responseObject, @"返回出錯(cuò)");
        NOTIFY //繼續(xù)執(zhí)行
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"error:%@",error);
        XCTAssertNil(error, @"請(qǐng)求出錯(cuò)");
        NOTIFY //繼續(xù)執(zhí)行
    }];
    WAIT  //暫停
}

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

        self.stAlertView = [[STAlertView alloc]initWithTitle:@"驗(yàn)證碼" message:nil textFieldHint:@"請(qǐng)輸入手機(jī)驗(yàn)證碼" textFieldValue:nil cancelButtonTitle:@"取消" otherButtonTitle:@"確定" cancelButtonBlock:^{
            //點(diǎn)擊取消返回后執(zhí)行
            [self testAlertViewCancel];
            NOTIFY //繼續(xù)執(zhí)行
        } otherButtonBlock:^(NSString *b) {
            //點(diǎn)擊確定后執(zhí)行
            [self alertViewComfirm:b];
             NOTIFY //繼續(xù)執(zhí)行
        }];
        [self.stAlertView show];
  • 高級(jí)自動(dòng)化單元測(cè)試,推薦看LeanCloud 工程師的李智維的自動(dòng)化單元測(cè)試的直播錄影
  • 李智維的演示github
    其實(shí)講得非常不錯(cuò),自動(dòng)化單元測(cè)試,自動(dòng)化發(fā)布都有講到,不過由于自己的功力不夠,只能留著以后慢慢學(xué)習(xí)。

演示Demo下載:UnitTestDemoTests

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,937評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,333評(píng)論 25 708
  • 文章來自:http://blog.csdn.net/mj813/article/details/52451355 ...
    好大一只鵬閱讀 9,215評(píng)論 2 126
  • 1.測(cè)試與軟件模型 軟件開發(fā)生命周期模型指的是軟件開發(fā)全過程、活動(dòng)和任務(wù)的結(jié)構(gòu)性框架。軟件項(xiàng)目的開發(fā)包括:需求、設(shè)...
    Mr希靈閱讀 21,987評(píng)論 7 278
  • 上次熟悉了MarkDown的用法之后,由于各種原因一直沒有時(shí)間更新博客。。。這次打算把我之前總結(jié)的一些東西陸陸續(xù)續(xù)...
    niaoge2016閱讀 2,069評(píng)論 0 2