什么是單元測試
- 檢查是否每個代碼單元(例如類或函數(shù))是否能產(chǎn)生預(yù)期的結(jié)果
- 獨立運行的马昙,不依賴于其他模塊或組件
什么是UI測試
- 是屬于端到端的測試,是從應(yīng)用程序啟動到結(jié)束的測試過程
- 完全按照用戶和應(yīng)用程序交互的方式來復(fù)制與應(yīng)用程序的交互
- 比單元測試慢,運行起來更耗費資源
測試注意事項
測試應(yīng)該涵蓋:
- 核?功能:模型類和?法及其與控制器的交互
- UI?作流程
- 特殊的邊界條件
- Bug處理
測試原則FIRST
- Fast:測試模塊應(yīng)該是快速?效的诀蓉;
- Independent/Isolated:測試模塊應(yīng)該是獨?相互不影響的浸遗;
- Repeatable :測試實例應(yīng)該是可以重復(fù)使?的,測試結(jié)果應(yīng)該是相同的驾胆;
- Self-validating:測試應(yīng)完全?動化涣澡。輸出結(jié)果要么是“成功”,要么是“失敗”丧诺;
- Timely:理想情況下入桂,應(yīng)該在編寫要測試的?產(chǎn)代碼之前編寫測試(測試驅(qū)動開發(fā))
單元測試
- 可以通過新建
TestAppDelegate
,防止業(yè)務(wù)代碼對測試的影響
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
id XCTest = NSClassFromString(@"XCTest");
appDelegateClassName = XCTest ? @"TestAppDelegate" : NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
-
通過
Product --> Test
運行項目后锅必,我們打開當前程序的可執(zhí)行文件事格,會發(fā)現(xiàn)多了一個YPLoginAppUITests-Runner.app
image.png -
顯示
YPLoginAppUITests-Runner.app
的包內(nèi)容,發(fā)現(xiàn)里面有三個動態(tài)庫
image.png 新建一個
YPLoginApp.test.xcconfig
文件配置測試環(huán)境搞隐,鏈接動態(tài)庫XCTest
XCODE_LIBARAR = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library
FRAMEWORK_SEARCH_PATHS = $(inherited) "${XCODE_LIBARAR}/Frameworks"
HEADER_SEARCH_PATHS = $(inherited) "${XCODE_LIBARAR}/Frameworks/XCTest.framework/Headers"
OTHER_LDFLAGS = $(inherited) -framework "XCTest"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '${XCODE_LIBARAR}/PrivateFrameworks' '${XCODE_LIBARAR}/Frameworks'
- 現(xiàn)在可以直接在項目中手動調(diào)用
XCTest
驹愚,實現(xiàn)邊運行邊測試
#import <XCTest/XCTest.h>
// 管理者 XCTestSuite
XCTestSuite *suite = [XCTestSuite defaultTestSuite];
// 初始化 testCase
LoginAppUITests *testCase = [LoginAppUITests new];
// testCase --> suite
[suite addTest:testCase];
for (XCTest *test in suite.tests) {
[test runTest];
}
//指定執(zhí)行的具體sel
//[suite addTest:[LoginAppUITests testCaseWithSelector:@selector(testExample)]];
- 可以通過添加
測試斷點
來進行調(diào)試
image.png
第三方庫
我們可以通過
pod
導(dǎo)入SYTimer
和SYCSSColor
到測試項目中-
Product --> Test
運行后,可以看到項目中具體文件執(zhí)行的代碼比例
image.png -
點擊箭頭劣纲,跳轉(zhuǎn)到具體代碼頁逢捺,其中紅色代表未使用的代碼,綠色代表使用的代碼癞季,紅色注釋形狀代表此處部分代碼被使用
image.png
代表
UI測試
- 下面是一個賬號密碼登錄的測試劫瞳,可以實現(xiàn)自動登錄
XCUIApplication *app = [[XCUIApplication alloc] init];
[app launch];
XCUIElement *nameinputTextField = app.textFields[@"nameInput"];
XCUIElement *passwordInputTextField = app.secureTextFields[@"passwordInput"];
[nameinputTextField tap];
[nameinputTextField typeText:@"Cat\n"];
[passwordInputTextField doubleTap];
[passwordInputTextField typeText:@"123"];
[app.buttons.staticTexts[@"登錄"] tap];
- 其中
nameInput
、passwordInput
绷柒、登錄
是通過accessibilityIdentifiler
或者accessibilityLabel
屬性設(shè)置標志
image.png