前言:
本文章更像总结归纳,其中主要参考资料有:
风之痕_ : http://www.jianshu.com/p/f4ba532caed0
RasonWu:http://www.jianshu.com/p/8bbec078cabe
CocoaChina: http://www.cocoachina.com/ios/20150702/12253.html
基础介绍:
XCTestCase 这个类,衍生出两个分支:单元测试(Unit Testing)和自动化测试UI自动测试(UnitTest UI)。这两个测试类都是继承于XCTestCase,都只有.m文件
C877AC3D-C118-4D87-93E1-989B411810CE.png
创建完成后一些基本方法展示如下:
81D4223D-AD8D-4742-80F8-F3B83CABB2B7.png
XCTestCase的常用断言一览
@property (nonatomic,assign) int condition1;
@property (nonatomic,assign) int condition2;
@property (nonatomic,assign) int condition3;
@property (nonatomic,strong) NSString *condition4;
//这里的断言基本都以XCT开头,末参数一定为报错时展示的文字信息
//断言,最基本的测试,第一个参数为真,则通过
XCTAssert(_condition1 == _condition2, @"测试过程中出现错误");
//bool测试中的true测试,首参数为真通过
XCTAssertTrue(_condition1 == _condition2,@"BOOL测试中的true测试出错");
//bool测试中的false测试,首参数为假通过
XCTAssertFalse(_condition1 == _condition3,@"BOOL测试中的false测试出错");
//相等测试,首参数与次参数相等通过
XCTAssertEqual(_condition1, _condition2,@"相等测试出错");
//不相等测试,首参数与次参数不相等通过
XCTAssertNotEqual(_condition1, _condition3,@"不等测试出错");
//针对loat或double比较,首参数与次参数的差,比第三参数的值小,通过
//大于测试
XCTAssertGreaterThan(_condition1, _condition3, @"大于测试出错");
//大于等于测试
XCTAssertGreaterThanOrEqual(_condition1, _condition2, @"大于或等于测试出错");
//相差测试,首参数与次参数的差,比第三参数的值小,通过
XCTAssertEqualWithAccuracy(0.6, 0.5, 0.11, @"相差测试结果比第三参数大");
//针对loat或double比较,首参数与次参数的差,比第三参数的值大,通过
XCTAssertNotEqualWithAccuracy(0.6, 0.5, 0.01, @"相差测试结果比第三参数小");
//首参数为nil,通过
XCTAssertNil(nil, @"nil测试");
//首参数不为nil,通过
XCTAssertNotNil(_condition4,@"非nil测试");
//无条件报错
XCTFail(@"强制失败");
异步测试
Unit Testing除了进行一般测试外还可以进行异步测试。逻辑是设置一个【期望】,然后在异步方法中执行【期望满足】。外部则设定一个时间限制来捕获该【期望】。
//异步测试(期望测试)
- (void)testExpectation {
//声明一个期望
XCTestExpectation *exp = [self expectationWithDescription:@"这里写入操作出错的原因描述。。。"];
//添加一个新线程
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperationWithBlock:^{
//模拟这个异步操作需要2秒后才能获取结果,比如一个异步网络请求
sleep(2);
//模拟获取的异步操作后,获取结果,判断异步方法的结果是否正确
XCTAssertEqual(_condition1, _condition2,@"返回结果又问题");
//如果断言没问题,就调用fulfill宣布测试满足期望
//注:如果你申明了多个期望,每个都需要fulfill
[exp fulfill];
}];
//延迟捕获,3秒后未获得满足的期望,会报错。这里修改为"1"就会报错
[self waitForExpectationsWithTimeout:3 handler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"Timeout Error: %@", error);
}
}];
}
代码覆盖率测试
Unit Testing还可以测试代码覆盖率(代码覆盖率 = 实际执行的代码行数 / 整个工程总代码行数)
如果某个类中代码覆盖率并不是100%,那么有可能类中存在冗余代码,或者类中有方法被遗忘了,不管哪一种我们都应该尽力解决它。
实现方法:
点击product->scheme->Edit Scheme
进入编辑方案页面
1D0E6ACA-61E7-438F-9710-798722AB36EF.png
打开代码覆盖率计数功能(XCode关闭后会自动关闭)
E5A6B8D3-387C-4086-93F9-6A4BCE043BBA.png
以Test模式运行项目,快捷键commond+U
测试通过后,在Report Navigator窗口可以查看代码覆盖率
7EDD08A8-3B2C-4602-954A-AEC0817B937D.png
双击类或者方法,可以打开,查看具体方法的执行情况。
AD4DB30F-3BB7-4E66-9EA2-2F851C57B926.png
XCTestCase与CocoaPods
如果在XCTestCase中使用CocoaPods的话,Pod中导入的库在XCTestCase是不能直接使用的。
会发生找不到路径的错误,需要进行如下配置
Podfile
platform :ios, '7.0'
pod 'AFNetworking', '~> 2.5.0'
pod 'STAlertView', '~> 1.0.0'
1.修改 TARGETS => XCTestCaseTests => Build Phases => Header Search Paths
1306128-119ee1f0f17dcffb.gif
2.修改 TARGETS => XCTestCaseTests => Build Phases => 新增 => PODS_ROOT
1306128-e298d476bd2553e1.gif
3.如果想使用Http地址进行网络访问
Info.plist => 添加 => NSAppTransportSecurity(类型Dictionary)。
NSAppTransportSecurity => NSAllowsArbitraryLoads(类型Boolean) =>设置值YES
4.如果想要在#import "xxxx" 中显示你导入的第三方库中类的名称
采用如下方法(消耗一定内存):
63CCC2DD-FD94-4D14-8534-4BAAC1F4846A.png
其中【$(SRCROOT)】可以再约束下成为更精准的定位,今后再研究
成果展示:
另外:1、2两步骤还有另外一种操作方式可以达到同样效果
CF206FEB-D237-42D9-960C-C71C829365AD.pngUnitTest UI测试
这个测试工具主要功能是自动执行设置的UI操作流程,达到自动化测试的目的。对于一些逻辑复杂的调试情况十分有利。例子:登陆后填写表单,测试表单中每一行测试缺失的报错情况。
操作流程:
0C5CF711-2223-4F65-881D-53FAD268512E.png
附录:XCTest的三种UI测试对象
1.XCUIApplication 当前测试应用target
2.XCUIElementQuery 定位查询当前UI中xctuielement的一个类
3.XCUIElement UI测试中任何一个item项都被抽象成一个XCUIElement类型
出现过的问题:
问题一、"library not found for - xxxxxx"
问题原因:项目中使用pods,但xcode编译时找不到目标库
解决方案:在Library Search Paths中指定缺失的路径
注:我发生的情况Test缺失了Path路径,所以直接从项目XCTestCase中把对应的路径拷贝到Test的Build Setting中就好了
资料:
http://www.jianshu.com/p/f4ba532caed0
http://www.jianshu.com/p/8bbec078cabe
http://www.cocoachina.com/ios/20150702/12253.html
网友评论