/*------------使用Xcode自帶單元測試UnitTest-----*/? ?
?/*? ? 單元測試:就是為你的方法專門寫一個測試函數(shù)。以保證你的方法在不停的修改開發(fā)中署照,保持正確蒲祈。如果出錯簇秒,讓你第一時間知道焊傅,這樣從最小單位開始監(jiān)控來保證軟件的質(zhì)量? ? ? ? ??
什么時候用到單元測試:1.寫完代碼以后:想要驗(yàn)證一下自己寫的代碼是否有問題策幼;?
?? 2.寫代碼之前:寫代碼之前把所有的功能模塊設(shè)計(jì)好肺缕,測試通過了再寫左医。??
? 3.修復(fù)某個bug后:一般修復(fù)完某個bug,為了確保修復(fù)是否成功同木,會寫測試? ? ?
? ?怎么寫單元測試:
1.創(chuàng)建一個工程浮梢,名字隨便取一個,但記得要勾選include Unit Tests,如果像我一樣操作過快忘記了彤路,不要直接再重新建一個工程(這樣可以秕硝,但是有點(diǎn)low),可以有其他方式創(chuàng)建斩萌,畢竟條條大道通羅馬缝裤,F(xiàn)ile->new->target->iOS->Test->iOS Unit Testing Bundle ,名字隨你取??
? 2.工程創(chuàng)建完成之后,要怎么開始測試呢颊郎?首先找到單元測試Testes文件夾中.m文件憋飞,看一看有幾個方法及什么時候調(diào)用它們,它們的作用又是什么? ? ? ? ? ? ? 解釋具體方法的作用及什么時候去掉用它們? ? ? ?
?? 1.? ? - (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)用? ? }? ? ??
? 2.? ? - (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];? ? }? ?
?3.? ? - (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開頭? ? }? ?
?4.? ? - (void)testPerformanceExample {? ? // This is an example of a performance test case.? ? 測試性能例子? ? [self measureBlock:^{? ? // Put the code you want to measure the time of here.? ? 需要測試性能的代碼-代碼運(yùn)行的時間? ? //這個方法主要是做性能測試的内狸,所謂性能測試检眯,主要就是評估一段代碼的運(yùn)行時間。該方法就是性能測試方法的樣例昆淡。? ? }];? ? }? ?
?5.在ViewController中寫一個簡單方法锰瘸,如- (int)getNumber;? ? 實(shí)現(xiàn)? ? - (int)getNumber{? ? ? ? ? return 100;? ? }? ? ? ? ? 在測試的文件中導(dǎo)入ViewController.h,并且定義一個vc屬性? ? ? ? ? #import#import "ViewController.h"
@interface ____Tests : XCTestCase
@property (nonatomic,strong) ViewController *vc;
@end
@implementation ____Tests
測試用例的實(shí)現(xiàn)
- (void)setUp {
[super setUp];
// 實(shí)例化需要測試的類
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快捷方式運(yùn)行避凝,或者produce-->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.
for (int i = 0; i<100; i++) {
NSLog(@"dd");
}
}];
}
我們在例子中添加一個for循環(huán)管削,測試其性能。command+u運(yùn)行就能看到如圖:
QQ20160129-5.png
能夠非常直觀的看出其調(diào)用的時間撑螺,可以用其來對比性能的優(yōu)劣含思。
另外XCTest還支持異步單元測試,我就不在這里展開了。最后附上常用的斷言及解釋含潘。
XCTFail(format…) 生成一個失敗的測試饲做;
XCTAssertNil(a1, format...)為空判斷,a1為空時通過调鬓,反之不通過艇炎;
XCTAssertNotNil(a1, format…)不為空判斷酌伊,a1不為空時通過腾窝,反之不通過;
XCTAssert(expression, format...)當(dāng)expression求值為TRUE時通過居砖;
XCTAssertTrue(expression, format...)當(dāng)expression求值為TRUE時通過虹脯;
XCTAssertFalse(expression, format...)當(dāng)expression求值為False時通過;
XCTAssertEqualObjects(a1, a2, format...)判斷相等奏候,[a1 isEqual:a2]值為TRUE時通過循集,其中一個不為空時,不通過蔗草;
XCTAssertNotEqualObjects(a1, a2, format...)判斷不等咒彤,[a1 isEqual:a2]值為False時通過;
XCTAssertEqual(a1, a2, format...)判斷相等(當(dāng)a1和a2是 C語言標(biāo)量咒精、結(jié)構(gòu)體或聯(lián)合體時使用, 判斷的是變量的地址镶柱,如果地址相同則返回TRUE,否則返回NO)模叙;
XCTAssertNotEqual(a1, a2, format...)判斷不等(當(dāng)a1和a2是 C語言標(biāo)量歇拆、結(jié)構(gòu)體或聯(lián)合體時使用);
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判斷相等范咨,(double或float類型)提供一個誤差范圍故觅,當(dāng)在誤差范圍(+/-accuracy)以內(nèi)相等時通過測試;
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判斷不等渠啊,(double或float類型)提供一個誤差范圍输吏,當(dāng)在誤差范圍以內(nèi)不等時通過測試;
XCTAssertThrows(expression, format...)異常測試替蛉,當(dāng)expression發(fā)生異常時通過贯溅;反之不通過;(很變態(tài)) XCTAssertThrowsSpecific(expression, specificException, format...) 異常測試灭返,當(dāng)expression發(fā)生specificException異常時通過盗迟;反之發(fā)生其他異常或不發(fā)生異常均不通過熙含;
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)異常測試罚缕,當(dāng)expression發(fā)生具體異常、具體異常名稱的異常時通過測試怎静,反之不通過邮弹;
XCTAssertNoThrow(expression, format…)異常測試黔衡,當(dāng)expression沒有發(fā)生異常時通過測試;
XCTAssertNoThrowSpecific(expression, specificException, format...)異常測試腌乡,當(dāng)expression沒有發(fā)生具體異常盟劫、具體異常名稱的異常時通過測試,反之不通過与纽;
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)異常測試侣签,當(dāng)expression沒有發(fā)生具體異常、具體異常名稱的異常時通過測試急迂,反之不通過
*/