Xcode 自带单元测试
使用背景
1.為了更快、更高效的開發(fā), 開發(fā)過程中經(jīng)常要寫一些測(cè)試用例。 2.在開發(fā)過程中,有些很深的界面,需要滿足很多條件、造很多假數(shù)據(jù)才可以進(jìn)入的,但是前面那些界面我們根本就沒有涉及修改,只是想進(jìn)入最后這個(gè)界面;比如:訂單支付完成界面。 這時(shí)候我們可以寫測(cè)試用例,直接讓其進(jìn)入到想要進(jìn)入的界面。
測(cè)試用例分為:單元測(cè)試和UI測(cè)試。 Xcode自帶了測(cè)試用例文件。一般大的項(xiàng)目以及優(yōu)秀的開源庫都有測(cè)試用例的,比如:AFNetworking。 不會(huì)寫的可以到這下載AFNetworking源碼參考。
創(chuàng)建測(cè)試用例
1.新建工程文件,勾選測(cè)試用例
如果忘記勾選了, 也可以通過新建來創(chuàng)建。 和新建文件一樣。2.新建完的工程 測(cè)試用例和其他工程文件,分別屬于不同的target。
3.測(cè)試用例文件 新的的測(cè)試用例文件,都是這個(gè)結(jié)構(gòu)和基本的四個(gè)方法。
#import <XCTest/XCTest.h>@interface XcodeTestsTests : XCTestCase@end@implementation XcodeTestsTests/*!* @brief 初始化方法。* 初始化、代碼復(fù)用、準(zhǔn)備測(cè)試條件*/ - (void)setUp {[super setUp];// Put setup code here. This method is called before the invocation of each test method in the class. } /*!* @brief 銷毀方法* 每次測(cè)試用例跑完,都會(huì)跑這個(gè)方法,釋放對(duì)象、回收資源、避免干擾*/ - (void)tearDown {// Put teardown code here. This method is called after the invocation of each test method in the class.[super tearDown]; } /*!* @brief 測(cè)試用例方法* 注意: 這里方法必須以test開頭,不然識(shí)別不了。* 開始測(cè)試用例方法,cmd+u 或者直接點(diǎn)擊右側(cè)這個(gè)小框箭頭即可*/ - (void)testExample {// This is an example of a functional test case.// Use XCTAssert and related functions to verify your tests produce the correct results. }/*!* @brief 性能測(cè)試方法* 可以測(cè)試某一段方法的性能、耗時(shí)情況*/ - (void)testPerformanceExample {// This is an example of a performance test case.[self measureBlock:^{// Put the code you want to measure the time of here.}]; }@end 復(fù)制代碼寫測(cè)試用例基本都在testExample方法里完成。
注意:問題點(diǎn)
寫了一個(gè)最簡(jiǎn)單的測(cè)試用例,運(yùn)行不起來, 運(yùn)行報(bào)錯(cuò):-[UIApplication applicationState] must be used from main thread only。控制臺(tái)報(bào)錯(cuò)信息:Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]
解決辦法: 打開Xcode的Edit Scheme, 找到Test選項(xiàng),去掉Runtime Api 檢測(cè)選項(xiàng)即可。
以上正常情況下就可以運(yùn)行了。 下面我們開始寫一個(gè)簡(jiǎn)答的測(cè)試用例。
寫測(cè)試用例
測(cè)試用例的過程一般分三步,這里以測(cè)試ViewController的一個(gè)加方法為例:
然后實(shí)現(xiàn)方法:
- (NSInteger)addFunction:(NSInteger)a andB:(NSInteger)b {return a + b; }復(fù)制代碼2.在測(cè)試用例里導(dǎo)入頭文件#import "ViewController.h" 以及初始化對(duì)象,準(zhǔn)備測(cè)試條件。
3.開始測(cè)試方法
- (void)testAddFunction {// This is an example of a functional test case.// Use XCTAssert and related functions to verify your tests produce the correct results.//1.創(chuàng)建測(cè)試條件NSInteger a = 1, b = 2;//2.進(jìn)行測(cè)試,直接調(diào)用測(cè)試方法NSInteger sam = [self.VC addFunction:a andB:b];//3.斷言。斷言方法有N多種,詳細(xì)見下面。 測(cè)試最核心。XCTAssertEqual(sam, 3); //前面這個(gè)是測(cè)試條件,后面的值是我們期望的值。 如果是正確的就測(cè)試通過,否則直接掛掉。} 復(fù)制代碼斷言一覽表:
XCTFail(format…) 生成一個(gè)失敗的測(cè)試; 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í)使用, 判斷的是變量的地址,如果地址相同則返回TRUE,否則返回NO); 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í)通過測(cè)試; XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判斷不等,(double或float類型)提供一個(gè)誤差范圍,當(dāng)在誤差范圍以內(nèi)不等時(shí)通過測(cè)試; XCTAssertThrows(expression, format...)異常測(cè)試,當(dāng)expression發(fā)生異常時(shí)通過;反之不通過;(很變態(tài)) XCTAssertThrowsSpecific(expression, specificException, format...) 異常測(cè)試,當(dāng)expression發(fā)生specificException異常時(shí)通過;反之發(fā)生其他異?;虿话l(fā)生異常均不通過; XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)異常測(cè)試,當(dāng)expression發(fā)生具體異常、具體異常名稱的異常時(shí)通過測(cè)試,反之不通過; XCTAssertNoThrow(expression, format…)異常測(cè)試,當(dāng)expression沒有發(fā)生異常時(shí)通過測(cè)試; XCTAssertNoThrowSpecific(expression, specificException, format...)異常測(cè)試,當(dāng)expression沒有發(fā)生具體異常、具體異常名稱的異常時(shí)通過測(cè)試,反之不通過; XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)異常測(cè)試,當(dāng)expression沒有發(fā)生具體異常、具體異常名稱的異常時(shí)通過測(cè)試,反之不通過 復(fù)制代碼異步測(cè)試
舉一個(gè)最簡(jiǎn)答的例子:進(jìn)入到具體界面里的的方法:
//這里就直接定義一個(gè)字符串,假如出現(xiàn)異常,就直接拋出這個(gè)字符串XCTestExpectation *ex = [self expectationWithDescription:@"這里應(yīng)該得進(jìn)到訂單完成界面"];OrderPayDoneViewController *controller = [[OrderPayDoneViewController alloc] initWithNibName:nilbundle:nil];//這里就是訂單完成界面需要的屬性,可以隨便造假數(shù)據(jù)controller.orderId = @"這是訂單 ID";controller.isPaidSuccess = YES;controller.orderAmount = @"23456";controller.payMethod = @"Paypal";controller.displayAmount = @"$11.8.0";[CurrentViewController().navigationController pushViewController:controlleranimated:YES]; //下面這兩個(gè)方法就是XCTestExpectation的API[ex fulfill]; //這個(gè)方法不懂, 不寫也可以調(diào)用[self waitForExpectations:@[ex] timeout:1000000];//這個(gè)不調(diào)用不能跳轉(zhuǎn) 復(fù)制代碼單元測(cè)試
單元測(cè)試內(nèi)容很多,還需要更多的研究,測(cè)試也很重要,對(duì)于開發(fā)對(duì)于測(cè)試都很重要,多多學(xué)習(xí)下單元測(cè)試吧。
后續(xù)
UI測(cè)試,可以自動(dòng)進(jìn)行測(cè)試。最基本的注冊(cè)登錄流程等常規(guī),可以跑UI測(cè)試。。 內(nèi)容比較多, 后續(xù)繼續(xù)研究補(bǔ)充。
總結(jié)
以上是生活随笔為你收集整理的Xcode 自带单元测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery 赋值时不触发change事
- 下一篇: 路由器的硬件组成和软件系统-路由器的硬件