單元測試的粒度最小,通常由開發小組採用白盒方式來測試,主要測試單元是否符合「設計」.html
集成測試介於單元測試和系統測試之間,起到「橋樑做用」,通常由開發小組採用白盒+黑盒的方式來測試,既難「設計」,又驗證「需求」。java
系統測試的粒度最大,通常由獨立測試小組採用黑盒方式來測試,主要測試系統是否符合「需求規格說明書」。ios
驗收測試與系統測試類似,主要區別是測試人員不兩隻,驗收測試由用戶執行。git
黑盒測試不考慮程序內部結構和邏輯結構,主要是用來測試系統的功能是否知足需求規格說明書。通常會有一個輸入值,一個輸出值,和指望值作比較。
github
白盒測試主要應用在單元測試階段,主要是對代碼級的測試,針對程序內部邏輯結構,測試手段有:語句覆蓋、斷定覆蓋、條件覆蓋、路徑覆蓋、條件組合覆蓋
安全
集成測試主要用來測試模塊與模塊之間的接口,同時還要測試一些主要業務功能。
ruby
系統測試是在通過以上各階段測試確認以後,把系統完事地模擬客戶環境來進行的測試。
網絡
因爲只是一些簡單實用的東西,學學仍是挺不錯的。其實單元測試用的好,開發起來也會快不少。單元測試對於我目前來講,就是爲了方便測試一些功能是否正常運行,還有調試接口是否能正常使用。有時候你多是爲了測試某一個網絡接口,而後每次都從新啓動而且通過不少操做以後才測試到了那個網絡接口。若是使用了單元測試,就能夠直接測試那個方法,相對方便不少。 好比因爲修改較多,咱們想測試一下分享功能是否正常,這時候就有用了。(而不是從新啓動程序,進入到分享界面,點擊分享,填寫分享內容。)其實單元測試並無下降咱們打代碼的效率,咱們能夠在單元測試經過了,直接用到相應的地方。
固然也有一些高級的做用,好比自動發佈、自動測試(特別在一些大的項目,以防止程序被誤改或引發新的問題)。
如今,讓咱們先理清一下單元測試到底有些什麼東西?
OCUnit(即用XCTest進行測試
)其實就是蘋果自帶的測試框架,咱們主要講的就是這個。GHUnit是一個可視化的測試框架。(有了它,你能夠點擊APP來決定測試哪一個方法,而且能夠點擊查看測試結果等。)OCMock就是模擬某個方法或者屬性的返回值,你可能會疑惑爲何要這樣作?使用用模型生成的模型對象,再傳進去不就能夠了?da an是能夠的,可是有特殊的狀況。好比你測試的是方法A,方法A裏面調用到了方法B,並且方法B是有參數傳入,但又不是方法A所提供。這時候,你可使用OCMock來模擬方法B返回的值。(在不影響測試的狀況下,就能夠這樣去模擬。)除了這些,在沒有網絡的狀況下,也能夠經過OCMock模擬返回的數據。UITests就是經過代碼化來實現自動點擊界面,輸入文字等功能。靠人工操做的方式來覆蓋全部測試用例是很是困難的,尤爲是加入新功能之後,舊的功能也要從新測試一遍,這致使了測試須要花很是多的時間來進行迴歸測試,這裏產生了大量重複的工做,而這些重複的工做有些是能夠自動完成的,這時候UITests就能夠幫助解決這個問題了。app
1.新建項目:
框架
18CA997F-4911-4B99-9A83-2AB44A77E8E8.png
2.最簡單的測試,注意截圖路徑的問題
進入到這個類,setUp是每一個測試方法調用前執行,tearDowLICEcapn是每一個測試方法調用後執行。testExample是測試方法,和咱們新建的沒有差異。不過測試方法必須testXXX的格式,且不能有參數,否則不會識別爲測試方法。測試方法的執行順序是字典序排序。
按快捷鍵Command + U進行單元測試,這個快捷鍵是所有測試。
testExample方法中輸入
NSLog(@"自定義測試testExample");
int a= 3;
XCTAssertTrue(a == 0,"a 不能等於 0");
點擊播放按鈕,開始單個方法的測試:
8F503AA4-C630-419A-9F66-C779C81A5581.png
出現以下結果,因爲咱們斷言a是不能等於0的,因此測試沒有經過。固然有其它的,用到再看,demo裏都有。
8BAD5CD6-7FB7-4626-A1F8-CBC2B6B35E89.png
使用CocoaPods安裝AFNetworking和STAlertView(CocoaPods安裝和使用教程 )
Pofile:
platform :ios, '7.0'pod 'AFNetworking', '~> 2.5.0'pod 'STAlertView', '~> 1.0.0'
這時會發現AFNetworking根本無法在單元測試裏使用,由於沒有找到庫,因此咱們須要配置一下:
UITestDemo設置.gif
UITestDemo設置2.gif
在Info.plist中添加NSAppTransportSecurity類型Dictionary。 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設爲YES。設置位置以下:
A0F7275A-D79D-4DA4-955B-8BFE862D10E4.png
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