kkbox-ios-dev筆記(四) - 單元測試

單元測試

  • 以程序測試程序,以代碼測試代碼您访。測試每個功能是否正常運行铅忿。

AAA原則

  • Xcode里面建立項目時,可以選擇Xcode將我們的 App 建立單元測試的綁定灵汪。會出現(xiàn)一個繼承自XCTestCase的類檀训,在里面編寫任何用test開頭的方法柑潦,都是一條測試實例。也就是我們寫測試的時候峻凫,就是寫出一群用test為開頭的方法渗鬼。
  • 擴展:Xcode從 5.1 版開始到現(xiàn)在的測試框架叫作XCTest,在這之前是使用一套叫作OCUnit的測試框架荧琼,除此之外譬胎,還有GHUnitKiwi等有名的測試框架铭腕。
  • AAA原則:在編寫測試的時候银择,基本原則就是一次只測試一項函數(shù)或方法多糠。同時一個test實例會包含所謂的 AAA 原則:Arrange累舷、ActAssert
  • Arrange:先設(shè)定我們在這次測試中夹孔,所預測的結(jié)果
  • Act:就是我們想要測試的函數(shù)或方法
  • Assert:確認在Act發(fā)生后被盈,執(zhí)行了想要的函數(shù)或方法后,的確符合我們在Arrange階段設(shè)定的目標搭伤。
  • 比如:
  • 在貪吃蛇游戲中只怎,預期一條長度為 6、正在往左邊移動的蛇怜俐,先往上移動一格身堡、再往右走一格、再往下走一格之后拍鲤,這條蛇的頭一定會撞到自己的身體贴谎,如果我們的程序說蛇頭沒有撞到,就一定有 bug季稳。就可以拆解成:
  • Arrange:頭應(yīng)該會撞到身體
  • Action:讓蛇執(zhí)行往上右下移動的動作
  • Assert:確認蛇頭真的撞到身體了
- (void)testHit

{
// 蛇對象
KKSnake *snake = [[KKSnake alloc]
initWithWorldSize:KKMakeSnakeWorldSize(10, 10) length:6];
// 蛇動作
[snake changeDirection:KKSnakeDirectionUp];[[snake move];
[snake changeDirection:KKSnakeDirectionRight];[snake move];
[snake changeDirection:KKSnakeDirectionDown];[snake move];
XCTAssertEqual([snake isHeadHitBody], YES, @"must hit the bo
dy.");
}

* 如果我們想要測試“蛇的尾巴加長”這段程序是否正常擅这,`思路:`原本這條蛇的長度為 2,尾巴位在`(6, 5)`,假如蛇的身體要加長兩格景鼠,預期舍得長度變成 4仲翎,尾巴為在`(8, 5)`.

```swift
- (void)testIncreaseLength

{
ZBSnake *snake = [[ZBSnake alloc] initWithWorldSize:ZBMakeSn
akeWorldSize(10, 10) length:2];
XCTAssertEqual((int)[snake.points count], 2, @"Length must b
e 2 but %d", [snake.points count]);
NSInteger x;
NSInteger y;
x = [snake.points[[snake.points count] - 1] snakePointValue]
.x;
y = [snake.points[[snake.points count] - 1] snakePointValue]
.y;
XCTAssertEqual(x, 6, @"must be 6");
XCTAssertEqual(y, 5, @"must be 5");
[snake increaseLength:2];
XCTAssertEqual((int)[snake.points count], 4, @"Length must b
e 4 but %d", [snake.points count]);
x = [snake.points[[snake.points count] - 1] snakePointValue]
.x;
y = [snake.points[[snake.points count] - 1] snakePointValue]
.y;
XCTAssertEqual(x, 8, @"must be 8");
XCTAssertEqual(y, 5, @"must be 5");
}

執(zhí)行測試

  • 寫了測試程序之后,我們可以在 Xcode 里面點擊Product -> Test執(zhí)行單元測試铛漓。如果XCTAssertEqual這行assert出現(xiàn)問題溯香,Xcode 就會立刻出現(xiàn)警告。
  • 在代碼的編輯頁面中浓恶,每一個test實例前方會出現(xiàn)一個菱形的標示逐哈,如果這個標示是空白的,代表還沒有執(zhí)行測試问顷。執(zhí)行完畢之后昂秃,如果成功禀梳,就會是綠色,反之就會變成紅色肠骆∷阃荆可以直接通過鼠標點擊此棱形標示,執(zhí)行測試蚀腿。
Snip20170226_4.png
  • 在 Xcode 的左側(cè)工具條的第四項嘴瓤,叫作Test Navigator,在這邊我們可以找到我們目前所在項目的所有test實例,在這里可以看到每個test實例是成功或失敗莉钙,也可以通過點擊廓脆,直接跳到特定test的實例代碼。
Snip20170226_6.png
  • 在 Xcode 的左側(cè)工具條的最后一項磁玉,叫作Report Navigator停忿,可以看到最近一次完整執(zhí)行所有test實例的結(jié)果。
Snip20170226_7.png

測試驅(qū)動開發(fā)

  • Kent Beck在2002年出版的書中提出測試驅(qū)動開發(fā)的概念:在開發(fā)軟件的時候蚊伞,我們不是先寫主要功能席赂,而是先寫測試。過程應(yīng)該是Red时迫、Green颅停、Refactor三個階段:
  • Red:在還沒有主要功能前,先寫單元測試掠拳。由于主要功能都還沒有編寫癞揉,自然無法通過剛剛寫出來的單元測試,所以會亮出紅色的燈號溺欧。
  • Green:開始實現(xiàn)主要功能喊熟,直到可以通過單元測試,讓測試的燈號變成綠色胧奔。
  • Refactor:繼續(xù)整理寫出的代碼逊移。

覆蓋率(Coverage)

  • 所謂覆蓋率就是我們的單元測試覆蓋了程序的多少比例,也就是龙填,有多少程序被測試到胳泉、以及沒有被測試到。當我們發(fā)出有程序沒有被測試到之后岩遗,便進一步編寫跟多的test實例扇商,確保我們的程序經(jīng)過完整的測試。
  • 在 Xcode7及以上版本中直接包含計算覆蓋率的功能宿礁。要在 Xcode 中展示覆蓋率案铺,首先是在Scheme中,勾選Gather Coverage Data.
Snip20170226_9.png
  • 接著梆靖,在執(zhí)行單元測試的時候控汉,就可以看到有一個標示Coverage的分頁笔诵,標示每個項目的覆蓋率是多少。
Snip20170226_10.png
  • 選擇任意文件編輯姑子,便可以看到在頁面的最右方乎婿,可以看到每行程序在test實例中被執(zhí)行了數(shù)次,如果沒有執(zhí)行到(執(zhí)行次數(shù)為 0)街佑,背景就會變成紅色谢翎,提醒我們應(yīng)該要對這部分寫單元測試。
Snip20170226_13.png
Snip20170226_14.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沐旨,一起剝皮案震驚了整個濱河市森逮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磁携,老刑警劉巖褒侧,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颜武,居然都是意外死亡璃搜,警方通過查閱死者的電腦和手機拖吼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門鳞上,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吊档,你說我怎么就攤上這事篙议。” “怎么了怠硼?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵鬼贱,是天一觀的道長。 經(jīng)常有香客問我香璃,道長这难,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任葡秒,我火速辦了婚禮姻乓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眯牧。我一直安慰自己蹋岩,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布学少。 她就那樣靜靜地躺著剪个,像睡著了一般。 火紅的嫁衣襯著肌膚如雪版确。 梳的紋絲不亂的頭發(fā)上扣囊,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天乎折,我揣著相機與錄音,去河邊找鬼侵歇。 笑死笆檀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的盒至。 我是一名探鬼主播酗洒,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枷遂!你這毒婦竟也來了樱衷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤酒唉,失蹤者是張志新(化名)和其女友劉穎矩桂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痪伦,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡侄榴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了网沾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞蚕。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辉哥,靈堂內(nèi)的尸體忽然破棺而出桦山,到底是詐尸還是另有隱情,我是刑警寧澤醋旦,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布恒水,位于F島的核電站,受9級特大地震影響饲齐,放射性物質(zhì)發(fā)生泄漏钉凌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一捂人、第九天 我趴在偏房一處隱蔽的房頂上張望御雕。 院中可真熱鬧,春花似錦先慷、人聲如沸饮笛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽福青。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間无午,已是汗流浹背媒役。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪迟,地道東北人酣衷。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像次泽,于是被迫代替她去往敵國和親穿仪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理意荤,服務(wù)發(fā)現(xiàn)啊片,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 簡介 測試目的:模擬多種可能性玖像,減少錯誤紫谷,增強健壯性,提高穩(wěn)定性捐寥。 測試種類:在iOS中的通常分為單元測試和UI測...
    i順頌時宜閱讀 9,122評論 0 39
  • 轉(zhuǎn):http://www.reibang.com/p/d5fca0185e83 Xcode測試 前言 總算在今天把...
    測試小螞蟻閱讀 2,895評論 0 20
  • 編寫測試可不是一項迷人的工作;然而笤昨,由于測試可以避免使你的寶貝應(yīng)用程序變成一塊充斥錯誤的大垃圾場,所以編寫測試又是...
    cosWriter閱讀 1,581評論 0 4
  • 單元測試不是一個小工程握恳,需要多用些時間才能做好瞒窒,不要希望通過這個文章就能掌握單元測試,這只是一個入門睡互,需要自己動手...
    勇不言棄92閱讀 7,817評論 9 60