IOS单元测试(—)

来源:互联网 发布:淘宝助手安卓版 编辑:程序博客网 时间:2024/06/05 07:12

单元测试

  • 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' dopod '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求值为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"); // 通过测试
0 0
原创粉丝点击