1.添加UnitTest身隐,UITest
Xcode7開(kāi)始邀泉,引進(jìn)了包含UITest UnitTest的工具,你可以在創(chuàng)建新程序的時(shí)候勾選對(duì)應(yīng)項(xiàng)胚迫,然后系統(tǒng)就會(huì)自動(dòng)生成該測(cè)試工具喷户。
如果你的app已經(jīng)創(chuàng)建有一段時(shí)間了,可以通過(guò)addTarget的形式來(lái)添加
2.UnitTest
UnitTest叫做單元測(cè)試访锻,也叫做模塊測(cè)試褪尝,主要是針對(duì)程序模塊進(jìn)行一對(duì)一的測(cè)試工作。確保每個(gè)模塊都沒(méi)有問(wèn)題期犬,從而提高整體程序的質(zhì)量河哑。
在默認(rèn)生成的測(cè)試文件中,有以下方法
- (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
//初始化的代碼龟虎,在測(cè)試方法調(diào)用之前調(diào)用
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
// 釋放測(cè)試用例的資源代碼璃谨,這個(gè)方法會(huì)每個(gè)測(cè)試用例執(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.
// 測(cè)試用例的例子,注意測(cè)試用例一定要test開(kāi)頭
}
- (void)testPerformanceExample {
// This is an example of a performance test case.
// 測(cè)試性能例子
[self measureBlock:^{
// Put the code you want to measure the time of here.
// 需要測(cè)試性能的代碼
}];
}
XCTestCase使用
XCTestCase的初始化不是用戶控制的鲤妥,針對(duì)一個(gè)功能塊的單元測(cè)試(針對(duì)某個(gè)class)佳吞,只需要單獨(dú)給為這個(gè)類創(chuàng)建一個(gè)繼承于XCTestCase,在這個(gè)文件內(nèi)實(shí)現(xiàn)上述基本函數(shù)以后(一半系統(tǒng)會(huì)默認(rèn)創(chuàng)建這三個(gè)函數(shù))棉安,其實(shí)的邏輯只需要開(kāi)發(fā)者自行定義以“test”開(kāi)頭的函數(shù)底扳,然后在內(nèi)部實(shí)現(xiàn)自己針對(duì)某個(gè)函數(shù)、返回?cái)?shù)值結(jié)果垂券、操作等的測(cè)試腳本即可花盐,commond+U執(zhí)行的時(shí)間,單元測(cè)試會(huì)自動(dòng)執(zhí)行這些test打頭的函數(shù)菇爪,當(dāng)函數(shù)頭上出現(xiàn)藍(lán)色的標(biāo)記則表明測(cè)試通過(guò),否則直接報(bào)紅色錯(cuò)誤柒昏。
開(kāi)發(fā)的時(shí)候凳宙,經(jīng)常需要傳遞參數(shù)給方法去執(zhí)行事情,在這種情況下职祷,如何保證在后臺(tái)返回錯(cuò)誤數(shù)據(jù)氏涩,執(zhí)行到方法里面不會(huì)崩潰
在測(cè)試的文件中導(dǎo)入ViewController.h届囚,并且定義一個(gè)vc屬性
#import "ViewController.h"
@interface UnitTestTests : XCTestCase
@property (strong, nonatomic) ViewController * vc;
@end
在ViewController里面寫(xiě)一個(gè)簡(jiǎn)單的方法,并放出去
- (void)setMessageWithStr:(NSString *)str
{
NSLog(@"%@", str);
}
然后在UnitTest里面添加一個(gè)測(cè)試方法是尖,記住一定要以test開(kāi)頭
- (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
_vc = [[ViewController alloc] init];
}
- (void)testAboutViewController
{
NSArray * array = @[@"first", @"second", @[], @{}, @YES, [NSNull null]];
for (NSString * str in array)
{
[_vc setMessageWithStr:str];
}
}
command+u可以快速編譯意系,或者produce-->test都行,就可以開(kāi)始進(jìn)行單元測(cè)試
測(cè)試成功后饺汹,左邊的小按鈕會(huì)出現(xiàn)一個(gè)綠色的小溝
修改setMessageWithStr方法為以下再重新編譯
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UITextView * textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
textView.center = self.view.center;
[self.view addSubview:textView];
textView.tag = 10000;
}
- (void)setMessageWithStr:(NSString *)str
{
UITextView * textView = (id)[self.view viewWithTag:10000];
if (str.length > 0)
{
textView.text = [textView.text stringByAppendingString:[NSString stringWithFormat:@"\n%@", str]];
}
}
可以看到編譯出錯(cuò)蛔添,選擇左邊出錯(cuò)的測(cè)試方法,可以找到代碼以及原因
附上常用的斷言以及解釋兜辞,可以直接用在測(cè)試方法里面迎瞧,根據(jù)需要進(jìn)行測(cè)試
// 生成一個(gè)失敗的測(cè)試;
XCTFail(format…)
// 為空判斷逸吵,a1為空時(shí)通過(guò)凶硅,反之不通過(guò);
XCTAssertNil(a1, format...)
// 不為空判斷扫皱,a1不為空時(shí)通過(guò)足绅,反之不通過(guò);
XCTAssertNotNil(a1, format…)
// 當(dāng)expression求值為T(mén)RUE時(shí)通過(guò)韩脑;
XCTAssert(expression, format...)
// 當(dāng)expression求值為T(mén)RUE時(shí)通過(guò)编检;
XCTAssertTrue(expression, format...)
// 當(dāng)expression求值為False時(shí)通過(guò);
XCTAssertFalse(expression, format...)
// 判斷相等扰才,[a1 isEqual:a2]值為T(mén)RUE時(shí)通過(guò)允懂,其中一個(gè)不為空時(shí),不通過(guò)衩匣;
XCTAssertEqualObjects(a1, a2, format...)
// 判斷不等蕾总,[a1 isEqual:a2]值為False時(shí)通過(guò);
XCTAssertNotEqualObjects(a1, a2, format...)
// 判斷相等(當(dāng)a1和a2是 C語(yǔ)言標(biāo)量琅捏、結(jié)構(gòu)體或聯(lián)合體時(shí)使用, 判斷的是變量的地址生百,如果地址相同則返回TRUE,否則返回NO)柄延;
XCTAssertEqual(a1, a2, format...)
// 判斷不等(當(dāng)a1和a2是 C語(yǔ)言標(biāo)量蚀浆、結(jié)構(gòu)體或聯(lián)合體時(shí)使用);
XCTAssertNotEqual(a1, a2, format...)
// 判斷相等搜吧,(double或float類型)提供一個(gè)誤差范圍市俊,當(dāng)在誤差范圍(+/-accuracy)以內(nèi)相等時(shí)通過(guò)測(cè)試;
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)
// 判斷不等滤奈,(double或float類型)提供一個(gè)誤差范圍摆昧,當(dāng)在誤差范圍以內(nèi)不等時(shí)通過(guò)測(cè)試;
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...)
// 異常測(cè)試蜒程,當(dāng)expression發(fā)生異常時(shí)通過(guò)绅你;反之不通過(guò)伺帘;(很變態(tài))
XCTAssertThrows(expression, format...)
// 異常測(cè)試,當(dāng)expression發(fā)生specificException異常時(shí)通過(guò)忌锯;反之發(fā)生其他異澄奔蓿或不發(fā)生異常均不通過(guò);
XCTAssertThrowsSpecific(expression, specificException, format...)
// 異常測(cè)試偶垮,當(dāng)expression發(fā)生具體異常张咳、具體異常名稱的異常時(shí)通過(guò)測(cè)試,反之不通過(guò);
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)
// 異常測(cè)試,當(dāng)expression沒(méi)有發(fā)生異常時(shí)通過(guò)測(cè)試逝淹;
XCTAssertNoThrow(expression, format…)
// 異常測(cè)試,當(dāng)expression沒(méi)有發(fā)生具體異常婚陪、具體異常名稱的異常時(shí)通過(guò)測(cè)試,反之不通過(guò)频祝;
XCTAssertNoThrowSpecific(expression, specificException, format...)
// 異常測(cè)試泌参,當(dāng)expression沒(méi)有發(fā)生具體異常、具體異常名稱的異常時(shí)通過(guò)測(cè)試常空,反之不通過(guò)
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)*
UITest
打開(kāi)建立好的UITest模塊沽一,創(chuàng)建testUI方法,并將光標(biāo)放在方法內(nèi)漓糙,可以看到如下頁(yè)面铣缠,選擇左下角的紅色圓點(diǎn),程序就會(huì)運(yùn)行起來(lái)昆禽,同時(shí)你可以在app上進(jìn)行一些交互操作
每次點(diǎn)擊UI上的控件蝗蛙,系統(tǒng)都會(huì)生成一條對(duì)應(yīng)的語(yǔ)句添加到testUI方法里面,但是系統(tǒng)自動(dòng)生成的方法是識(shí)別不了中文的醉鳖,會(huì)出現(xiàn)一下的問(wèn)題
可以將圖中的\U7b2c\U4e8c\U9875改為對(duì)應(yīng)的中文就可以繼續(xù)執(zhí)行了捡硅。
此處聲明: 第一次點(diǎn)擊紅色的recorder按鈕,然后手動(dòng)操作會(huì)自動(dòng)生成測(cè)試腳本盗棵,第二次commond+U是進(jìn)行測(cè)試UI