IOS单元测试(—)
2016-08-05 16:51
316 查看
单元测试
OCUnit(即XCTest测试)这个就是苹果自己的测试框架
GHUnit
这是一个可视化的测试框架,可以点击app来决定测试哪个方法,并且可以点击查看测试结果等。(后续详细叙述)
OCMock
这个是模拟某个方法或者属性的返回值。(后续详细叙述)
创建一个简单的单元测试
新建项目:最简单的单元测试
一个简单的测试demo
该类继承自XCTestCase类,其中包含三个方法:setUp,tearDown和testExample。setUp方法用于在测试前设置好要测试的方法,tearDown则是在测试后将设置好的要测试的方法拆卸掉。testExample是测试方法。测试方法必须以testxxx的格式,并且不能有参数和返回值,不然不会识别为测试方法。测试方法的执行顺序是字典排序。快捷键command+ u进行单元测试,这个快捷键是全部测试。当有多个测试方法时候不管顺序如何排列,测试方法执行的顺序与方法名中test后面的字符大小有关,小者优先,例如testA,testB1,testB2三个方法相继执行。在testExample方法中输入
NSLog(@"自定义测试testExample"); NSString *temp; int a=3; XCTAssertNil(temp,@"a为空"); XCTAssertTrue(3==a,@"a等于3");
进行网络请求的测试
使用CocoaPods安装AFNetworking和STAlerView# platform :ios, '9.0' target 'UnitTestDemo' do pod 'AFNetworking', '~> 3.1.0' pod 'STAlertView', '~> 1.0.0'
在Info.plist中添加NSAppTransportSecurity类型Dictionary。 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES。
IOS9的http安全问题:现在进行异步请求的网络测试,由于测试方法主线程执行完就会结束,所以需要设置一下否则没发查看异步返回的结果。
#define WAIT do {\ [self expectationForNotification:@"RSBaseTest" object:nil handler:nil];\ [self waitForExpectationsWithTimeout:30 handler:nil];\ } while (0); #define NOTIFY \ [[NSNotificationCenter defaultCenter]postNotificationName:@"RSBaseTest" object:nil];
测试方法
-(void)testRequest { AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 返回的格式 JSON manager.responseSerializer = [AFJSONResponseSerializer serializer]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // 可接受的文本参数规格 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/plain", nil]; manager.requestSerializer.timeoutInterval = 10; [manager GET:@"http://www.weather.com.cn/adat/sk/101110101.html" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"responseObject:%@",responseObject); XCTAssertNotNil(responseObject, @"返回出错"); self.stAlertView = [[STAlertView alloc]initWithTitle:@"验证码" message:nil textFieldHint:@"请输入手机验证码" textFieldValue:nil cancelButtonTitle:@"取消" otherButtonTitle:@"确定" cancelButtonBlock:^{ //点击取消返回后执行 [self testAlertViewCancel]; NOTIFY //继续执行 } otherButtonBlock:^(NSString *b) { //点击确定后执行 [self alertViewComfirm:b]; NOTIFY //继续执行 }]; NOTIFY //继续执行 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"error:%@",error); XCTAssertNil(error, @"请求出错"); // NOTIFY //继续执行 }]; WAIT //暂停 } -(void)testAlertViewCancel{ NSLog(@"取消"); } -(void)testAlertViewComfirm{ [self alertViewComfirm:nil]; } -(void)alertViewComfirm:(NSString *)test{ NSLog(@"手机验证码:%@",test); }
断言测试
下面一共18个断言(SDK中也是18个,其含义转自ios UnitTest 学习笔记,真心佩服原文的博主,部分宏小弟已经测试过): XCTFail(format…) 生成一个失败的测试; XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过; XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过; XCTAssert(expression, format...)当expression求 4000 值为TRUE时通过; XCTAssertTrue(expression, format...)当expression求值为TRUE时通过; XCTAssertFalse(expression, format...)当expression求值为False时通过; XCTAssertEqualObjects(a1, a2, format...)判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过; XCTAssertNotEqualObjects(a1, a2, format...)判断不等,[a1 isEqual:a2]值为False时通过; XCTAssertEqual(a1, a2, format...)判断相等(当a1和a2是 C语言标量、结构体或联合体时使用,实际测试发现NSString也可以); XCTAssertNotEqual(a1, a2, format...)判断不等(当a1和a2是 C语言标量、结构体或联合体时使用); XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/-accuracy)以内相等时通过测试; XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试; XCTAssertThrows(expression, format...)异常测试,当expression发生异常时通过;反之不通过;(很变态) XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过; XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过; XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试; XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过; XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
特别注意下XCTAssertEqualObjects和XCTAssertEqual。
XCTAssertEqualObjects(a1, a2, format…)的判断条件是[a1 isEqual:a2]是否返回一个YES。
XCTAssertEqual(a1, a2, format…)的判断条件是a1 == a2是否返回一个YES。
对于后者,如果a1和a2都是基本数据类型变量,那么只有a1 == a2才会返回YES。例如下面代码中只有第二行可以通过测试:
// 比较基本数据类型变量 XCTAssertEqual(1, 2, @"a1 = a2 shoud be true"); // 无法通过测试 XCTAssertEqual(1, 1, @"a1 = a2 shoud be true"); // 通过测试
但是,如果a1和a2都是指针,那么只有a1和a2指向同一个对象才会返回YES。array1和array2指向不同对象,无法通过测试。.例如下面的代码中:
// 比较NSArray对象 NSArray *array1 = @[@1]; NSArray *array2 = @[@1]; NSArray *array3 = array1; XCTAssertEqual(array1, array2, @"a1 and a2 should point to the same object"); // 无法通过测试 XCTAssertEqual(array1, array3, @"a1 and a2 should point to the same object"); // 通过测试
对于字符串就不同了,由于str1和str2指向同一常量,常量在内存的data段中地址是固定的,所以二者地址相同。
// 比较NSString对象 NSString *str1 = @"1"; NSString *str2 = @"1"; NSString *str3 = str1; XCTAssertEqual(str1, str2, @"a1 and a2 should point to the same object"); // 通过测试 XCTAssertEqual(str1, str3, @"a1 and a2 should point to the same object"); // 通过测试
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 5 个适合系统管理员使用的告警可视化工具
- Ruby单元测试框架TestUnit的替代者MiniTest介绍
- Android学习笔记之应用单元测试实例分析
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- iOS App开发中的UISegmentedControl分段组件用法总结
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题