iOS單元測試

由于只是一些簡單實用的東西,學學還是挺不錯的。其實單元測試用的好,開發起來也會快很多。單元測試對于我目前來說,就是為了方便測試一些功能是否正常運行,還有調試接口是否能正常使用。有時候你可能是為了測試某一個網絡接口,然后每次都重新啟動并且經過很多操作之后才測試到了那個網絡接口。如果使用了單元測試,就可以直接測試那個方法,相對方便很多。 比如由于修改較多,我們想測試一下分享功能是否正常,這時候就有用了。(而不是重新啟動程序,進入到分享界面,點擊分享,填寫分享內容。)其實單元測試并沒有降低我們打代碼的效率,我們可以在單元測試通過了,直接用到相應的地方。

當然也有一些高級的作用,比如自動發布、自動測試(特別在一些大的項目,以防止程序被誤改或引起新的問題)。

現在,讓我們先理清一下單元測試到底有些什么東西?

OCUnit(即用XCTest進行測試)其實就是蘋果自帶的測試框架,我們主要講的就是這個。GHUnit是一個可視化的測試框架。(有了它,你可以點擊APP來決定測試哪個方法,并且可以點擊查看測試結果等。)OCMock就是模擬某個方法或者屬性的返回值,你可能會疑惑為什么要這樣做?使用用模型生成的模型對象,再傳進去不就可以了?答案是可以的,但是有特殊的情況。比如你測試的是方法A,方法A里面調用到了方法B,而且方法B是有參數傳入,但又不是方法A所提供。這時候,你可以使用OCMock來模擬方法B返回的值。(在不影響測試的情況下,就可以這樣去模擬。)除了這些,在沒有網絡的情況下,也可以通過OCMock模擬返回的數據。UITests就是通過代碼化來實現自動點擊界面,輸入文字等功能。靠人工操作的方式來覆蓋所有測試用例是非常困難的,尤其是加入新功能以后,舊的功能也要重新測試一遍,這導致了測試需要花非常多的時間來進行回歸測試,這里產生了大量重復的工作,而這些重復的工作有些是可以自動完成的,這時候UITests就可以幫助解決這個問題了。

最簡單的單元測試

1.新建項目:

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

2.最簡單的測試,注意截圖路徑的問題

進入到這個類,setUp是每個測試方法調用執行,tearDown是每個測試方法調用執行。testExample是測試方法,和我們新建的沒有差別。不過測試方法必須testXXX的格式,且不能有參數,不然不會識別為測試方法。測試方法的執行順序是字典序排序。

按快捷鍵Command + U進行單元測試,這個快捷鍵是全部測試。

testExample方法中輸入

NSLog(@"自定義測試testExample");

int? a= 3;

XCTAssertTrue(a == 0,"a 不能等于 0");

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

8F503AA4-C630-419A-9F66-C779C81A5581.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];

高級自動化單元測試,推薦看LeanCloud 工程師的李智維的自動化單元測試的直播錄影

李智維的演示github

其實講得非常不錯,自動化單元測試,自動化發布都有講到,不過由于自己的功力不夠,只能留著以后慢慢學習。

演示Demo下載:UnitTestDemoTests

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容