前言
隨著APP功能的不斷增加,僅僅靠黑盒測試人工來覆蓋測試無疑有很大的局限性,效果也不如人意,尤其是新功能增加后可能要對舊功能做回歸測試,產(chǎn)生了大量的重復(fù)工作,而這些重復(fù)工作有一些是可以通過自動(dòng)化測試進(jìn)行完成的,UITests的出現(xiàn)就是為了解決這個(gè)問題.
UItests介紹
UITests是什么?
UItests是由蘋果公司開發(fā)的一個(gè)自動(dòng)測試UI交互的自動(dòng)化測試框架
UItests能做什么?
UItests可以幫助我們解決一些測試上的重復(fù)工作,節(jié)省人工成本,提高測試效率等.
UITests使用
新創(chuàng)建的項(xiàng)目可以通過勾選include UI Tests來添加

現(xiàn)有項(xiàng)目可以通過以下步驟來添加.


成功添加UITests組件后,在項(xiàng)目文件導(dǎo)航里可以看到對應(yīng)目錄.

UITestDemoUITests.m就是用來編寫測試案例的文件.
注:測試方法都是以test開頭的
測試代碼可以通過錄制和直接編寫兩種方法來生成,建議先通過自動(dòng)生成 然后修改自動(dòng)生成的代碼.
聲明一個(gè)新的測試方法 點(diǎn)擊小圓點(diǎn) 自動(dòng)打開模擬器運(yùn)行項(xiàng)目 對項(xiàng)目的操作會(huì)被用代碼的形式記錄下來

自動(dòng)記錄的代碼也十分好理解,點(diǎn)擊了login按鈕 再點(diǎn)擊了id為Detail的導(dǎo)航欄上的Mune按鈕
點(diǎn)擊左上角的棱形標(biāo)志則代表執(zhí)行這個(gè)測試方法,自動(dòng)打開模擬器執(zhí)行.
測試方法執(zhí)行成功標(biāo)志內(nèi)出現(xiàn)一個(gè)綠勾,失敗則是紅叉.
測試進(jìn)行中會(huì)在控制臺(tái)打印參數(shù),包括當(dāng)前操作 耗時(shí)等,測試完成則會(huì)打印測試log保存地址.

簡單測試案例
- (void)testLogi{
XCUIElement *account = [[XCUIApplication alloc] init].textFields[@"account"];
XCUIElement *pwd = [[XCUIApplication alloc] init].textFields[@"password"];
XCUIApplication *app = [[XCUIApplication alloc] init];
//判斷賬號密碼是否都是偶數(shù) 是則跳轉(zhuǎn) 不是則直接下一次測試
//跳轉(zhuǎn)后等待3s 返回登錄界面
int success = 0;
int failed = 0;
for (int i = 0; i<10; i++) {
int acc = arc4random() % 1000;
int pw = arc4random() % 1000;
[account tap];
[account typeText:[NSString stringWithFormat:@"%d",acc]];
[pwd tap];
[pwd typeText:[NSString stringWithFormat:@"%d",pw]];
//點(diǎn)擊登錄
[app.buttons[@"login"] tap];
//模擬正常登錄網(wǎng)絡(luò)訪問等待3s
[app.windows.navigationBars.element pressForDuration:3];
//判斷是否跳轉(zhuǎn)到登錄之后的界面 如果是 則登錄成功
if ([app.navigationBars.element.identifier isEqualToString:@"Detail"]) {
[app.navigationBars[@"Detail"].buttons[@"Mune"] tap];
NSLog(@"登錄成功");
success += 1;
}else{
NSLog(@"登錄失敗");
failed += 1;
}
}
NSLog(@"10次測試,成功登錄%d次,失敗%d次",success,failed);
}
測試結(jié)果:

斷言
注:斷言結(jié)果會(huì)記錄在測試的log文件中,斷言失敗則該測試方法不通過.
//斷言,最基本的測試,如果expression為true則通過,否則打印后面格式化字符串
XCTAssert(expression, format...)
//Bool測試:
XCTAssertTrue(expression, format...)
XCTAssertFalse(expression, format...)
//相等測試
XCTAssertEqual(expression1, expression2, format...)
XCTAssertNotEqual(expression1, expression2, format...)
//double float 對比數(shù)據(jù)測試使用
XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, format...)
XCTAssertNotEqualWithAccuracy(expression1, expression2, accuracy, format...)
//Nil測試,XCTAssert[Not]Nil斷言判斷給定的表達(dá)式值是否為nil
XCTAssertNil(expression, format...)
XCTAssertNotNil(expression, format...)
//失敗斷言
XCTFail(format...)