標籤:
所謂單元測試(又稱為模組測試, Unit Testing)就是針對程式模組(軟體設計的最小單位)來進行正確性檢驗的測試工作。
其實在我們開發的程式實現某個功能的時候我們也有進行測試。只不過,你是在項目代碼中直接寫的方法,而且在測試的時候,也是點點點,點到相應的介面才觸發相應的方法,進行測試,這測試效率,想想也是醉了,不過還好能正常測試,但是如果你想控制不同的輸入參數呢?好,你說直接寫入到程式。但是,你測試完成了之後呢?好,你說那就注釋掉啊。但是,如果後面你改動了又需要再測試一此呢?其實,說了這麼多,就是想說,在你的有效工程代碼外寫測試代碼,這就是單元測試了,完成後,一個Command+U直接進入入口進行代碼測試。
接下來就是怎麼進行代碼測試,這個網路一搜一大堆,但是都是在那個test.m檔案裡面直接寫寫寫得節奏,看了你肯定會問,就在這裡寫一些判斷1+1=?2的代碼?這什麼情況。其實不是這樣子的。按照目前Xcode的版本建立是這樣子的:
1、直接建立項目,預設就已經有了那個所謂的TestOCUnitTestTests.m檔案,建立完成之後如下,你直接看到了一個TestOCUnitTestTests.m檔案,那個就是放測試代碼的檔案了。
2、點擊你平時運行項目的那個三角形右邊的TestOCUnitTest可以看到新出來三個選項,new一個Scheme,然後把項目切換到TestOCUnitTestTests裡面,按住Command+U,會彈出一個Test Succeeded的提示框,表示成功。
3、接下來說說怎麼測試我們項目裡面的某個類的方法,我們隨便在自己的某個類建立一個方法,我就選在MasterViewController這個類裡面好了。具體實現的方法是在接收到的字串用[]包住,然後返回,代碼如下:
- (NSString *)getTestString:(NSString *)normalStr{ return [NSString stringWithFormat:@"[%@]",normalStr];}
記得聲明成外部可調用方法!
4、在TestOCUnitTestTests.m檔案裡面調用這個方法:
- (void)testExample { //1、找一個你需要進行單元測試的類,執行個體化 MasterViewController *controller = [[MasterViewController alloc]init]; NSString *normalStr = @"Objective-C"; NSString *expectStr = @"[Objective-C]"; //2、調用該對象需要進行單元測試的方法 NSString *returnStr = [controller getTestString:normalStr]; //3、斷言你預想中得傳回值及實際傳回值是否符合 NSLog(@"Is MasterViewController testStr getRightStr:"); XCTAssertEqualObjects(expectStr,returnStr, @"pass");}
可以運行之後,可以看到方法左邊打了個鉤鉤,說明測試是通過的。(PS:寫在TestOCUnitTestTests.m裡面的所有方法會預設執行,不用你手工去調用)
如果你測試的是你項目中的其他方法,那麼直接在在TestOCUnitTestTests.m裡面直接建立測試方法,傳參後斷言測試返回資料是否跟預期的一樣就行了,以上就是單元測試的使用。
對於一些常用的斷言測試函數,我直接拷貝過來好了,如下所示:
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語言標量、結構體或聯合體時使用, 判斷的是變數的地址,如果地址相同則返回TRUE,否則返回NO);
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沒有發生具體異常、具體異常名稱的異常時通過測試,反之不通過
iOS開發 使用OCUnit對程式進行單元測試(UnitTest)