缘由:过去一直认为测试单元或者断言这玩意用不到,但是当我们的测试走了,我们才安静的发现不能没有他,然后老大把测试的任务交给了我,建议我去写个测试用例检测一下UI交互,以及网络接口返回数据是否符合预期,最后发现轻量级的还是比较建议使用UITestCase,虽然只能测试一下纯业务逻辑和网络接口,也很开心了,毕竟后台给了40个新的接口,没人测试,我只能用这个,保证返回数据的准确性。
什么是单元测试?
苹果嫡系产物,直接在app的项目名+ Tests的测试模块(每个项目都会有)中测试业务逻辑,集中化管理测试用例,将测试的对象设置成最小的单元,方便开发人员测试
使用场景
测试一些纯业务逻辑的东西,还有就是网络接口返回的数据是否符合预期的判断
优点
统一化管理,书写代码,可以多次的进行回归测试,方便修改,节约成本和时间,一劳永逸
缺点
是不能和UI交互,太过于复杂的业务逻辑没法测试。
自定义一个TestCase
测试用例文件详解
测试函数的要求是:1.必须无返回值;2.以test开头;
Command + U去执行测试用例
下面说说具体的语法
一. XCTFail
XCTFail是一个宏,其作用就是让测试失败
后面的就是要报告的错误信息,由我们自定。
打印是这样的,显示了第几行,那个文件,哪个方法~
可以在发送网络请求的时候,如果是error的情况下,直接使用这个方法,打印具体的数据,快速定位。
XCTFail
TestCase'-[GEDemoTestCase testFail]'started./Users/wangxin/Get_iOS1.0/GetTests/GEDemoTestCase.m:27:error:-[GEDemoTestCasetestFail]:failed -Noimplementationfor"-[GEDemoTestCase testFail]"
二.其他各种测试
二、各种断言测试: (网络摘抄)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没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
PS:XCTAssertEqual(a1, a2, format...)这个是(1 == 3)基本数据类型,XCTAssertEqualObjects(a1, a2, format...)判断相等是对象类型,大多数测试都是好使的。
在TestCase中可以写逻辑判断,也可以去写一下网络请求数据的判断,但是问题是网络是异步的,那么就要去保存TestCase的生命,只有当数据加载完了,判断完了在让他死。github早在3年前就写好了分类~
分类的内容浅析
1.在你的testCase中#import "XCTest+Async.h"就好了
2.在项目中直接使用
判断网络返回数据的正确性
- (void)testExample { ASYNC_TEST_START [[AFHTTPSessionManager manager] GET:@"http://api.test.wangqiujia.com.cn/chaos/v2/dynamic/recommended"parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSInteger stuateCode = [responseObject[@"statusCode"] integerValue];if(stuateCode ==200|| stuateCode ==0) {//获取sorts字典NSArray *sorts = responseObject[@"sorts"];//获取的字典NSDictionary *items = responseObject[@"items"]; NSMutableArray *models = [NSMutableArray array]; NSArray *tempArr = nil;for(NSString *typeinsorts){if([type isEqualToString:@"activity"]) { tempArr = [ActiviteModel objectArrayWithKeyValuesArray:items[type]]; }elseif([type isEqualToString:@"course"]){ tempArr = [CourseModel objectArrayWithKeyValuesArray:items[type]]; }elseif([type isEqualToString:@"league"]){ tempArr = [THMatchModel objectArrayWithKeyValuesArray:items[type]]; }if(tempArr.count) { [models addObject:tempArr]; } }//进行对模型中的数据进行检查ActiviteModel *am = tempArr[0];//title 不能为空XCTAssertNotNil(am.title);//uid 是NSString类型XCTAssertTrue([am.uid isKindOfClass:[NSStringclass]]);//city_code == nilXCTAssertNil(am.city_code);//start_unixstamp 长度一定不是0XCTAssert(am.start_unixstamp.length !=0); } ASYNC_TEST_DONE } failure:^(NSURLSessionDataTask *task, NSError *error) { XCTFail("出现error"); ASYNC_TEST_DONE }]; ASYNC_TEST_END}
1.代码解析,在开始网络请求的时候,先去使用 ASYNC_TEST_START 保命 ,然后请求网络,成功或者失败都要 ASYNC_TEST_DONE 完成任务 ,如果失败,可以强制奔溃,打印原因,到了最后记得 ASYNC_TEST_END