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