領(lǐng)導(dǎo)給的需求是:
關(guān)于單元測試的任務(wù)反饋:
http://www.lxweimin.com/p/d15a7dea0c5a?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
這個(gè)我們能用不?有什么用
我將就三個(gè)方面回答上面的問題。
1.首先我們來關(guān)注下單元測試有什么用?
2.我們的項(xiàng)目能用不?如何用
3.單元測試的一些相關(guān)知識(shí)
1.首先我們來關(guān)注下單元測試有什么用?
首先什么是單元測試,維基百科上的解釋是:
在計(jì)算機(jī)編程中,單元測試(又稱為模塊測試, Unit Testing)是針對(duì)程序模塊(軟件設(shè)計(jì)的最小單位)來進(jìn)行正確性檢驗(yàn)的測試工作。程序單元是應(yīng)用的最小可測試部件。在過程化編程中,一個(gè)單元就是單個(gè)程序、函數(shù)、過程等;對(duì)于面向?qū)ο缶幊蹋钚卧褪欠椒ǎɑ悾ǔ悾⒊橄箢悺⒒蛘吲缮悾ㄗ宇悾┲械姆椒ā?/p>
通常來說,程序員每修改一次程序就會(huì)進(jìn)行最少一次單元測試,在編寫程序的過程中前后很可能要進(jìn)行多次單元測試,以證實(shí)程序達(dá)到軟件規(guī)格書(en:Specification)要求的工作目標(biāo),沒有程序錯(cuò)誤;雖然單元測試不是什么必須的,但也不壞,這牽涉到項(xiàng)目管理的政策決定。
由于我們OC程序員寫的通常都是面向?qū)ο蟮某绦颍晕覀冊(cè)谶M(jìn)行單元測試時(shí),通常都是以一個(gè)方法為單位測試,目的當(dāng)然是保證其不會(huì)出錯(cuò)了。按照Objc.io文章的觀點(diǎn),如果我們代碼之間的耦合度很小,那么可以將其分解成多個(gè)小部件,從而更易于測試。
2.我們的項(xiàng)目能用不?如何用
簡單的講 其實(shí)單元測試功能就是測試某一塊代碼段有沒有問題,而具體的測試就是執(zhí)行某一個(gè)類的代碼,得出一個(gè)結(jié)果,使用斷言的方式展示給你。你不必每次運(yùn)行起來看看效果, 所以你僅僅使用Comman+U 代替Command + R 就可以測試你自定義的代碼就行了,就是直接跑那些你抽取出來的代碼就行了。
我們的項(xiàng)目能不能用,答案是肯定的,按照領(lǐng)導(dǎo)給的鏈接操作是可以正常添加單元測試的,我們測試的時(shí)候可能只是一個(gè)方法一個(gè)方法的去測試,這就必須接口文件和實(shí)現(xiàn)文件有良好的代碼風(fēng)格,最主要的是上面的紅色的文字。
3.單元測試的一些相關(guān)知識(shí)
首先單元測試的框架有幾個(gè)鏈接如下:http://www.uml.org.cn/mobiledev/201201093.asp。
也可以看看這篇文章http://www.cocoachina.com/industry/20130724/6667.html
OCUnit
OCUnit是XCode 4.x集成的單元測試框架,OCUnit中的測試分為兩類,一類稱為Logic Tests,另一類稱為Application Tests。Logic Tests更傾向于所謂的白盒測試,用于測試工程中較細(xì)節(jié)的邏輯;Application Tests更傾向于黑盒測試,或接口測試,用于測試直接與用戶交互的接口。
? 創(chuàng)建測試用例
OCUnit的測試用例最常用的方法有三個(gè)
1. - (void)setUp:每個(gè)test方法執(zhí)行前調(diào)用
2. - (void)tearDown:每個(gè)test方法執(zhí)行后調(diào)用
3. - (void)testXXX:命名為XXX的測試方法
GHUnit
GHUnit是一款Objective-C的測試框架,除了支持iOS工程還支持OSX的工程,但OSX不在本文的討論范圍。GHUnit不同于OCUnit,它提供了GUI界面來操作測試用例,而且也不區(qū)分Logic Tests和Application Tests。
當(dāng)你創(chuàng)建項(xiàng)目或者對(duì)象(target)時(shí),Xcode會(huì)在構(gòu)建應(yīng)用程序的scheme中包含一個(gè)單元測試對(duì)象。對(duì)象的實(shí)現(xiàn)文件包含setUp、tearDown以及testExample方法的存根。完成這些存根實(shí)現(xiàn),并根據(jù)需要為執(zhí)行應(yīng)用程序上的單元測試添加其他代碼。通過選擇Product > Test來運(yùn)行所有測試。點(diǎn)擊測試導(dǎo)航器圖標(biāo)來查看狀態(tài)和測試結(jié)果。點(diǎn)擊測試導(dǎo)航欄右下角的按鈕(+)為項(xiàng)目添加測試對(duì)象(或者為測試添加類)。想要查看特定測試的源碼,請(qǐng)?jiān)跍y試列表中選中,源碼編輯器將會(huì)打開相應(yīng)的文件。
會(huì)簡單的操作以后, 我們了解下相關(guān)的斷言
下面一共18個(gè)斷言(SDK中也是18個(gè),其含義轉(zhuǎn)自ios UnitTest 學(xué)習(xí)筆記,真心佩服原文的博主,部分宏小弟已經(jīng)測試過):
XCTFail(format…) 生成一個(gè)失敗的測試;
XCTAssertNil(a1, format...)為空判斷,a1為空時(shí)通過,反之不通過;
XCTAssertNotNil(a1, format…)不為空判斷,a1不為空時(shí)通過,反之不通過;
XCTAssert(expression, format...)當(dāng)expression求值為TRUE時(shí)通過;
XCTAssertTrue(expression, format...)當(dāng)expression求值為TRUE時(shí)通過;
XCTAssertFalse(expression, format...)當(dāng)expression求值為False時(shí)通過;
XCTAssertEqualObjects(a1, a2, format...)判斷相等,[a1 isEqual:a2]值為TRUE時(shí)通過,其中一個(gè)不為空時(shí),不通過;
XCTAssertNotEqualObjects(a1, a2, format...)判斷不等,[a1 isEqual:a2]值為False時(shí)通過;
XCTAssertEqual(a1, a2, format...)判斷相等(當(dāng)a1和a2是 C語言標(biāo)量、結(jié)構(gòu)體或聯(lián)合體時(shí)使用,實(shí)際測試發(fā)現(xiàn)NSString也可以);
XCTAssertNotEqual(a1, a2, format...)判斷不等(當(dāng)a1和a2是 C語言標(biāo)量、結(jié)構(gòu)體或聯(lián)合體時(shí)使用);
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判斷相等,(double或float類型)提供一個(gè)誤差范圍,當(dāng)在誤差范圍(+/-accuracy)以內(nèi)相等時(shí)通過測試;
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判斷不等,(double或float類型)提供一個(gè)誤差范圍,當(dāng)在誤差范圍以內(nèi)不等時(shí)通過測試;
XCTAssertThrows(expression, format...)異常測試,當(dāng)expression發(fā)生異常時(shí)通過;反之不通過;(很變態(tài)) XCTAssertThrowsSpecific(expression, specificException, format...) 異常測試,當(dāng)expression發(fā)生specificException異常時(shí)通過;反之發(fā)生其他異常或不發(fā)生異常均不通過;
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)異常測試,當(dāng)expression發(fā)生具體異常、具體異常名稱的異常時(shí)通過測試,反之不通過;
XCTAssertNoThrow(expression, format…)異常測試,當(dāng)expression沒有發(fā)生異常時(shí)通過測試;
XCTAssertNoThrowSpecific(expression, specificException, format...)異常測試,當(dāng)expression沒有發(fā)生具體異常、具體異常名稱的異常時(shí)通過測試,反之不通過;
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)異常測試,當(dāng)expression沒有發(fā)生具體異常、具體異常名稱的異常時(shí)通過測試,反之不通過
特別注意下XCTAssertEqualObjects和XCTAssertEqual。
XCTAssertEqualObjects(a1, a2, format...)的判斷條件是[a1 isEqual:a2]是否返回一個(gè)YES。
XCTAssertEqual(a1, a2, format...)的判斷條件是a1 == a2是否返回一個(gè)YES。
最后看一下官方的一個(gè)計(jì)算器的Demo吧 ,看了基本上明白個(gè)大概了
https://developer.apple.com/library/prerelease/mac/samplecode/UnitTests/Introduction/Intro.html
忽略里面的mac程序, 跑iOS程序就行了
感覺這個(gè)計(jì)算器主要是功能上的測試,單元測試即是模塊測試, 我們應(yīng)用程序接入的可能感覺不大。
因?yàn)槠綍r(shí)斷點(diǎn)就夠用的了, 這只是我的片面之理解。可能理解的不到位。
最后有個(gè)問題,單元測試局限么? 比如某一個(gè)功能是否真的都可以用單元測試去測試?單元測試進(jìn)階改如何?
請(qǐng)高手回答幫助, 給個(gè)鏈接啥的也行, 多謝。