iOS 使用UnitTest和UITest進(jìn)行自我測(cè)試

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è)試

WechatIMG4836.jpeg

測(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è)試方法,可以找到代碼以及原因

WechatIMG4840.jpeg

附上常用的斷言以及解釋兜辞,可以直接用在測(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)行一些交互操作

WechatIMG4841.jpeg

每次點(diǎn)擊UI上的控件蝗蛙,系統(tǒng)都會(huì)生成一條對(duì)應(yīng)的語(yǔ)句添加到testUI方法里面,但是系統(tǒng)自動(dòng)生成的方法是識(shí)別不了中文的醉鳖,會(huì)出現(xiàn)一下的問(wèn)題

WechatIMG4853.jpeg

可以將圖中的\U7b2c\U4e8c\U9875改為對(duì)應(yīng)的中文就可以繼續(xù)執(zhí)行了捡硅。

WechatIMG4854.jpeg

此處聲明: 第一次點(diǎn)擊紅色的recorder按鈕,然后手動(dòng)操作會(huì)自動(dòng)生成測(cè)試腳本盗棵,第二次commond+U是進(jìn)行測(cè)試UI

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壮韭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纹因,更是在濱河造成了極大的恐慌喷屋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辐怕,死亡現(xiàn)場(chǎng)離奇詭異逼蒙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)寄疏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)是牢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人陕截,你說(shuō)我怎么就攤上這事驳棱。” “怎么了农曲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵社搅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乳规,道長(zhǎng)形葬,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任暮的,我火速辦了婚禮笙以,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冻辩。我一直安慰自己猖腕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布恨闪。 她就那樣靜靜地躺著倘感,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咙咽。 梳的紋絲不亂的頭發(fā)上老玛,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音钧敞,去河邊找鬼蜡豹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛犁享,可吹牛的內(nèi)容都是我干的余素。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼炊昆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桨吊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起凤巨,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤视乐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后敢茁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體佑淀,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年彰檬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伸刃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谎砾。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捧颅,靈堂內(nèi)的尸體忽然破棺而出景图,到底是詐尸還是另有隱情,我是刑警寧澤碉哑,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布挚币,位于F島的核電站,受9級(jí)特大地震影響扣典,放射性物質(zhì)發(fā)生泄漏妆毕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一贮尖、第九天 我趴在偏房一處隱蔽的房頂上張望笛粘。 院中可真熱鬧,春花似錦远舅、人聲如沸闰蛔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)序六。三九已至,卻和暖如春蚤吹,著一層夾襖步出監(jiān)牢的瞬間例诀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工裁着, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留繁涂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓二驰,卻偏偏與公主長(zhǎng)得像扔罪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桶雀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理矿酵,服務(wù)發(fā)現(xiàn),斷路器矗积,智...
    卡卡羅2017閱讀 134,665評(píng)論 18 139
  • 關(guān)于iOS的UI自動(dòng)化測(cè)試全肮,是從Xcode7之后才支持的比較好,使用XCTest.framework棘捣,Xcode可...
    房小房MT閱讀 5,241評(píng)論 4 13
  • layout: post title: "Xcode 7智能測(cè)試化工具XCTest學(xué)習(xí)" ...
    風(fēng)之痕_閱讀 22,657評(píng)論 14 101
  • 單元測(cè)試不是一個(gè)小工程辜腺,需要多用些時(shí)間才能做好,不要希望通過(guò)這個(gè)文章就能掌握單元測(cè)試,這只是一個(gè)入門(mén)评疗,需要自己動(dòng)手...
    勇不言棄92閱讀 7,819評(píng)論 9 60
  • 今天突然想吐槽一下餓了么及其背后的餐飲業(yè)测砂。想想我已經(jīng)是老用戶了,誒壤巷,戒不了了邑彪,已經(jīng)“中毒了” 在進(jìn)入大學(xué)前瞧毙,我只在...
    夕影西逝閱讀 202評(píng)論 0 1