初識iOS開發(fā)單元測試

單元測試就是為你的方法多專門寫一個測試函數(shù)。以保證你的方法在不停的修改開發(fā)中。保持正確。如果出錯,第一時間讓你知道,這樣從最小單位開始監(jiān)控來保證軟件的質(zhì)量。

內(nèi)置單元測試框架
在Xcode4.x中集成了測試框架OCUnit,根據(jù)測試的目的大致可以將單元測試分為這三類:
性能測試:測試代碼執(zhí)行花費的時間
邏輯測試:測試代碼執(zhí)行結(jié)果是否符合預期
異步測試:測試多線程操作代碼

什么時候用到單元測試:
1、寫完代碼以后:想要驗證一下自己寫的代碼是否有問題。
2、寫代碼之前:就是寫代碼之前所有的功能分模塊的設(shè)計好,測試通過了再寫。(我反正是沒用過)。
3、修復某個bug后:一般修復完某個bug,為了確保修復是成功的,會寫測試。

怎么寫單元測試
在我們新建項目的時候,已經(jīng)默認選擇創(chuàng)建單元測試的框架,除了Unit Tests之外還有一個UI Tests是iOS9推出的新特性,針對UI界面的單元測試框架。在創(chuàng)建項目之后,會自動生成一個appName+Tests的文件夾目錄,下面存放著單元測試的文件

創(chuàng)建一個工程,名字隨便取,直接勾選include Unit


忘了勾選怎么辦呢?可以有其他方式創(chuàng)建File-->new-->target-->iOS-->iOS Unit Testing Bundle。名字自己看著辦吧。




工程創(chuàng)建好后,那要怎么開始測試呢?
找到系統(tǒng)單元測試Testes文件夾中.m文件看中會到看到幾個方法,我們來看下這個幾個方法是什么時候調(diào)用和他們各種的作用

 - (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
//初始化的代碼,在測試方法調(diào)用之前調(diào)用
}

- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
// 釋放測試用例的資源代碼,這個方法會每個測試用例執(zhí)行后調(diào)用
[super tearDown];
}

- (void)testExample {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
// 測試用例的例子,注意測試用例一定要test開頭

}

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

在每個測試用例方法的左側(cè)有個菱形的標記,點擊這個標記可以單獨的運行這個測試方法。如果測試通過沒有發(fā)生任何斷言錯誤,那么這個菱形就會變成綠色勾選狀態(tài)。使用快捷鍵command+U直接依次調(diào)用所有的單元測試。另外,可以在左側(cè)的文件欄中選中單元測試欄目,然后直觀的看到所有測試的結(jié)果。同樣的點擊右側(cè)菱形位置的按鈕可以運行單個測試方法或者文件:



在ViewController中寫一個簡單的方法

- (int)getNum;

實現(xiàn):

- (int)getNum {

return 100;
}

在測試的文件中導入ViewController.h,并且定義一個vc屬性

 #import <XCTest/XCTest.h>

#import "ViewController.h"

@interface ____Tests : XCTestCase

@property (nonatomic,strong) ViewController *vc;


@end

@implementation ____Tests

測試用例的實現(xiàn)

- (void)setUp {
[super setUp];

// 實例化需要測試的類
self.vc = [[ViewController alloc] init];
}

- (void)tearDown {
// 清空
self.vc = nil;

[super tearDown];
}

- (void)testMyFuc {

// 調(diào)用需要測試的方法,
int result = [self.vc getNum];
// 如果不相等則會提示@“測試不通過”
XCTAssertEqual(result, 100,@"測試不通過");
}

command+u快捷方式運行,或者produce-->test都行,
工程就跑起來了



我們可以在在控制臺清晰的看到我們要測試的用例子通過了,測試通過的測試方法會有綠色的鉤。

這時候我們改下斷言,把100隨便改成一個數(shù),120.再comand+u運行下,看下什么情況



很明顯是能不能通過的,因為我們要測試的方法返回值是100,

自帶的測試框架還能測試某個方法的性能,

- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
    // Put the code you want to measure the time of here.

    for (int i = 0; i<100; i++) {

        NSLog(@"dd");
    }
}];

我們在例子中添加一個for循環(huán),測試其性能。command+u運行就能看到如圖:



我們在例子中添加一個for循環(huán),測試其性能。command+u運行就能看到如圖:



能夠非常直觀的看出其調(diào)用的時間,可以用其來對比性能的優(yōu)劣。
另外XCTest還支持異步單元測試,我就不在這里展開了。最后附上常用的斷言及解釋。
XCTFail(format…) 生成一個失敗的測試; 
XCTAssertNil(a1, format...)為空判斷,a1為空時通過,反之不通過;
XCTAssertNotNil(a1, format…)不為空判斷,a1不為空時通過,反之不通過;
XCTAssert(expression, format...)當expression求值為TRUE時通過;
XCTAssertTrue(expression, format...)當expression求值為TRUE時通過;
XCTAssertFalse(expression, format...)當expression求值為False時通過;
XCTAssertEqualObjects(a1, a2, format...)判斷相等,[a1 isEqual:a2]值為TRUE時通過,其中一個不為空時,不通過;
XCTAssertNotEqualObjects(a1, a2, format...)判斷不等,[a1 isEqual:a2]值為False時通過;
XCTAssertEqual(a1, a2, format...)判斷相等(當a1和a2是 C語言標量、結(jié)構(gòu)體或聯(lián)合體時使用, 判斷的是變量的地址,如果地址相同則返回TRUE,否則返回NO);
XCTAssertNotEqual(a1, a2, format...)判斷不等(當a1和a2是 C語言標量、結(jié)構(gòu)體或聯(lián)合體時使用);
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判斷相等,(double或float類型)提供一個誤差范圍,當在誤差范圍(+/-accuracy)以內(nèi)相等時通過測試;
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判斷不等,(double或float類型)提供一個誤差范圍,當在誤差范圍以內(nèi)不等時通過測試;
XCTAssertThrows(expression, format...)異常測試,當expression發(fā)生異常時通過;反之不通過;(很變態(tài)) XCTAssertThrowsSpecific(expression, specificException, format...) 異常測試,當expression發(fā)生specificException異常時通過;反之發(fā)生其他異?;虿话l(fā)生異常均不通過;
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)異常測試,當expression發(fā)生具體異常、具體異常名稱的異常時通過測試,反之不通過;
XCTAssertNoThrow(expression, format…)異常測試,當expression沒有發(fā)生異常時通過測試;
XCTAssertNoThrowSpecific(expression, specificException, format...)異常測試,當expression沒有發(fā)生具體異常、具體異常名稱的異常時通過測試,反之不通過;
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)異常測試,當expression沒有發(fā)生具體異常、具體異常名稱的異常時通過測試,反之不通過
最后編輯于
?著作權(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)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評論 25 708
  • 轉(zhuǎn):http://m.itdecent.cn/p/d5fca0185e83 Xcode測試 前言 總算在今天把...
    測試小螞蟻閱讀 3,400評論 0 20
  • 前言 維基百科對單元測試的定義如下: 在計算機編程中,單元測試(英語:Unit Testing)又稱為模塊測試, ...
    sindri的小巢閱讀 6,465評論 10 60
  • 一直以為少小時失去父母者為孤兒,直到父親辭世17年后的那天母親也呼出她在這個世間的最后一口氣,我突然意識到我成了孤...
    藍澗閱讀 385評論 0 0

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