什么是单元测试
- 检查是否每个代码单元(例如类或函数)是否能产生预期的结果
- 独立运行的,不依赖于其他模块或组件
什么是UI测试
- 是属于端到端的测试,是从应用程序启动到结束的测试过程
- 完全按照用户和应用程序交互的方式来复制与应用程序的交互
- 比单元测试慢,运行起来更耗费资源
测试注意事项
测试应该涵盖:
- 核⼼功能:模型类和⽅法及其与控制器的交互
- UI⼯作流程
- 特殊的边界条件
- Bug处理
测试原则FIRST
- Fast:测试模块应该是快速⾼效的;
- Independent/Isolated:测试模块应该是独⽴相互不影响的;
- Repeatable :测试实例应该是可以重复使⽤的,测试结果应该是相同的;
- Self-validating:测试应完全⾃动化。输出结果要么是“成功”,要么是“失败”;
- Timely:理想情况下,应该在编写要测试的⽣产代码之前编写测试(测试驱动开发)
单元测试
- 可以通过新建
TestAppDelegate
,防止业务代码对测试的影响
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
运行项目后,我们打开当前程序的可执行文件,会发现多了一个YPLoginAppUITests-Runner.app
image.png -
显示
YPLoginAppUITests-Runner.app
的包内容,发现里面有三个动态库
image.png 新建一个
YPLoginApp.test.xcconfig
文件配置测试环境,链接动态库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'
- 现在可以直接在项目中手动调用
XCTest
,实现边运行边测试
#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];
}
//指定执行的具体sel
//[suite addTest:[LoginAppUITests testCaseWithSelector:@selector(testExample)]];
- 可以通过添加
测试断点
来进行调试
image.png
第三方库
我们可以通过
pod
导入SYTimer
和SYCSSColor
到测试项目中-
Product --> Test
运行后,可以看到项目中具体文件执行的代码比例
image.png -
点击箭头,跳转到具体代码页,其中红色代表未使用的代码,绿色代表使用的代码,红色注释形状代表此处部分代码被使用
image.png
代表
UI测试
- 下面是一个账号密码登录的测试,可以实现自动登录
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
属性设置标志
image.png