UITestCase 测试单元的使用

作者: mkb2 | 来源:发表于2016-08-04 23:54 被阅读0次

缘由:过去一直认为测试单元或者断言这玩意用不到,但是当我们的测试走了,我们才安静的发现不能没有他,然后老大把测试的任务交给了我,建议我去写个测试用例检测一下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.公司的多个接口都要去测试,那么我们可以全都写测试用例,到时候屏幕全绿,全都正确,爽死了

相关文章

  • UITestCase 测试单元的使用

    缘由:过去一直认为测试单元或者断言这玩意用不到,但是当我们的测试走了,我们才安静的发现不能没有他,然后老大把测试的...

  • UITestCase 测试单元的使用

    缘由:过去一直认为测试单元或者断言这玩意用不到,但是当我们的测试走了,我们才安静的发现不能没有他,然后老大把测试的...

  • 4.vue造轮子-自动化测试

    使用 Karma + Mocha做单元测试使用 Karma + Mocha做单元测试使用 Karma + Moch...

  • 安卓单元测试 - 收藏集 - 掘金

    Android 单元测试 (三):JUnit 单元测试框架的使用 - Android - 掘金 我们写单元测试,一...

  • Go单元测试框架简单使用

    约束: 使用go自身的单元测试框架testing包来写单元测试有如下约束: 单元测试,要导入 testing 包;...

  • Python 学习笔记 066

    单元测试 对函数进行单元测试 对类进行单元测试 文档测试 创建函数的解释和介绍 使用Telnet命令远程连接别人的...

  • C 语言测试 - gtest

    C语言的单元测试框架 C语言单元测试框架unitC语言单元测试框架unit的使用_Vincent的专栏-CSDN博...

  • SpringBoot 单元测试与 Mockito 使用

    SpringBoot 单元测试与 Mockito 使用 单元测试应遵循 → AIR 原则 SpringBoot 测...

  • Spring Boot 单元测试

    单元测试service层代码 如果想在单元测试中使用Spring boot的依赖注入功能,需要在单元测试的clas...

  • 单元测试框架:Robolectric

    前言 前面我们介绍了单元测试框架 JUnit 和 Mockito 的使用(详情查看:单元测试框架:JUnit,单元...

网友评论

    本文标题:UITestCase 测试单元的使用

    本文链接:https://www.haomeiwen.com/subject/vylhsttx.html