UITestCase 测试单元的使用

缘由:过去一直认为测试单元或者断言这玩意用不到,但是当我们的测试走了,我们才安静的发现不能没有他,然后老大把测试的任务交给了我,建议我去写个测试用例检测一下UI交互,以及网络接口返回数据是否符合预期,最后发现轻量级的还是比较建议使用UITestCase,虽然只能测试一下纯业务逻辑和网络接口,也很开心了,毕竟后台给了40个新的接口,没人测试,我只能用这个,保证返回数据的准确性。


什么是单元测试?
苹果嫡系产物,直接在app的项目名+ Tests的测试模块(每个项目都会有)中测试业务逻辑,集中化管理测试用例,将测试的对象设置成最小的单元,方便开发人员测试

使用场景
测试一些纯业务逻辑的东西,还有就是网络接口返回的数据是否符合预期的判断

优点
统一化管理,书写代码,可以多次的进行回归测试,方便修改,节约成本和时间,一劳永逸

缺点
是不能和UI交互,太过于复杂的业务逻辑没法测试。

自定义一个TestCase
测试用例文件详解

测试函数的要求是:1.必须无返回值;2.以test开头;
Command + U去执行测试用例

说说系统中自带的方法

1.setUp所有的test,不论运行一个,还是运行很多个,都会调用,作用了viewDidLoad差不多,生成公用属性都可以用这个
2.tearDown结束的时候调用这个
3.[self measureBlock:^{ NSLog(@"我是测试看看是不是10变"); }]
不论在什么方法中调用,这个方法是调用10次,主要是因为一次不一定准(我猜的)。

2016-08-07 17:00:58.165 LGWaterMark[1893:77035] 我是测试看看是不是10变
2016-08-07 17:00:58.165 LGWaterMark[1893:77035] 我是测试看看是不是10变
2016-08-07 17:00:58.166 LGWaterMark[1893:77035] 我是测试看看是不是10变
2016-08-07 17:00:58.166 LGWaterMark[1893:77035] 我是测试看看是不是10变
2016-08-07 17:00:58.166 LGWaterMark[1893:77035] 我是测试看看是不是10变
2016-08-07 17:00:58.166 LGWaterMark[1893:77035] 我是测试看看是不是10变
2016-08-07 17:00:58.167 LGWaterMark[1893:77035] 我是测试看看是不是10变
2016-08-07 17:00:58.167 LGWaterMark[1893:77035] 我是测试看看是不是10变
2016-08-07 17:00:58.167 LGWaterMark[1893:77035] 我是测试看看是不是10变
2016-08-07 17:00:58.167 LGWaterMark[1893:77035] 我是测试看看是不是10变

** 下面说说具体的语法 **

一. XCTFail

XCTFail是一个宏,其作用就是让测试失败
后面的就是要报告的错误信息,由我们自定。
打印是这样的,显示了第几行,那个文件,哪个方法~
可以在发送网络请求的时候,如果是error的情况下,直接使用这个方法,打印具体的数据,快速定位。

XCTFail
Test Case '-[GEDemoTestCase testFail]' started.
/Users/wangxin/Get_iOS1.0/GetTests/GEDemoTestCase.m:27: error: -[GEDemoTestCase testFail] : failed - No implementation for "-[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年前就写好了分类~
github大神的分类

分类的内容浅析

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 *type in sorts){
                if ([type isEqualToString:@"activity"]) {
                    tempArr = [ActiviteModel objectArrayWithKeyValuesArray:items[type]];
                }else if([type isEqualToString:@"course"]){
                    tempArr = [CourseModel objectArrayWithKeyValuesArray:items[type]];
                }else if([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:[NSString class]]);
            //city_code == nil
            XCTAssertNil(am.city_code);
            //start_unixstamp 长度一定不是0
            XCTAssert(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不要命就好了~
2.先字典转模型,然后那对象中的属性进行逻辑的判断,非常方便,多次使用,一劳永逸
3.公司的多个接口都要去测试,那么我们可以全都写测试用例,到时候屏幕全绿,全都正确,爽死了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 缘由:过去一直认为测试单元或者断言这玩意用不到,但是当我们的测试走了,我们才安静的发现不能没有他,然后老大把测试的...
    ManSwift阅读 577评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    Mr希灵阅读 21,914评论 7 277
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    宇文臭臭阅读 6,686评论 5 100
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,493评论 18 399