ios开发中自动化测试的集中方法(没完成)

实际开发过程中,软件工程师有责任去编写一些测试用例,保证我们程序的健壮性。这里,探讨一下在ios和安卓不同的测试用例的区别和用法。

iOS篇

  • 以下是几种比较靠谱的测试框架
  • 1.NSAssert (断言,和普通代码在一起书写)
  • 2.WIKI,是从行为的角度思考问题。测试用例都遵循三段式Given-When-Then的描述,清晰地表达测试用例是测试什么样的对象或数据结构,在基于什么上下文或情景,然后做出什么响应。
  • 3.XCTest(Unit Test)(又称为模块测试, Unit Testing)单元测试非常适合用来做 app 的逻辑以及网络接口方面的测试,Xcode提供单元测试的是从测试的角度思考问题
  • 4.比如专注于提供 Mock 和 Stub 的 OCMock(建议使用GHUnit + OCMock组合进行单元测试)
  • 5.UITest

具体的使用方法和介绍

1.NSAssert(断言)

什么是断言?
程序运行时防止某些数据不符合预期,直接在使用数据的时候,对他用断言判断一下,保证数据的正确性

使用场景
在程序的任何位置,只要是对任何数据或者对象的怀疑,就可以对他们进行断言判断(只在debug模式开启,release默认关闭)

优点
和程序同步,当开发和测试人员使用app的时候,走到程序的任何位置,都时刻有断言给你保证你所使用的数据是符合你预期的,如有违背,直接就崩溃提醒,简单粗暴

当你要去使用一个变量的时候,你害怕他不对或者为空,通常你会判断一下

    GEUser * user =[GEUserTool userInfo];
    if (user.Token.length) {
        NSLog(@"用户的token不为空");
    }

这是我们正常的使用过程,没问题。如果测试测完了,说对,这很好,当下一个版本的时候,我们突然改动了些东西,这个位置的token为空了,测试又走到这里,没注意到无打印,那么这个隐藏的bug就这样放着,一直不会发现。我举得例子是比较小的,如果是个大的bug,测试忘了回归测试,责任是很大的,所以,为了保险起见,我们可以使用断言,哪怕测试没有发现,我们可以自定义的对错误做一个处理(自定义直接崩溃或者打印输出)!

    GEUser * user =[GEUserTool userInfo];
    NSAssert(user.Token.length != 0, @"用户的token不能是空的");
    if (user.Token.length) {
        NSLog(@"用户的token不为空");
    }

如果是这个样子,及时测试人员没有测试出来,系统会自动奔溃,打印出出错的断言的位置,方便我们调试,给开发人员和测试人员提供了诸多便利,具体内容请到我的另一篇文章看看详情.

2.UintTest(单元测试,属于TDD)

什么是单元测试?

苹果亲儿子,直接在app的UITestCase类中测试业务逻辑,集中化管理测试用例,将测试的对象设置成最小的单元,方便开发人员测试

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

优点

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

缺点
缺点是不能和UI交互,属于TDD类型,报错的描述在后面,不是特别容易理解,如果是项目转交给新的工程师,可能会费比较长的时间去理解测试用例

在TestCase中我们可以写很多的测试用例,可以一次性跑所有的,也可以一个一个来,可以试想一下,如果有50个网络接口,或者一些测试的判断,那么一口气跑下来,却都是对的,那多么的爽歪歪。
具体的内容可以参考我的另一篇文章 UITestCase 测试单元的使用

PS:感觉** NSAssertXCTAssert好像啊,语法基本一致,确实如此,只是他们的使用场景不同,一个是和普通代码在一起杂糅的写,时时刻刻判断数据,另一个是专门在TestCase类**中去判断数据或者对象是否符合自己的预期。

3.WIKI(属于BDD)

什么是WIKI?
WIKI是ios测试的开源库,测试用例都遵循三段式Given-When-Then的描述,清晰地表达测试用例是测试什么样的对象或数据结构,在基于什么上下文或情景,然后做出什么响应,报错的描述在前边,然后才是具体的逻辑判断,写完之后,就像是读一个句子一样,非常的方便,即使项目交给新的工程师,他们也会非常快速的接手测试

使用场景
应该是测试Case中

优点
统一化管理,书写代码,可以多次的进行回归测试,方便修改,节约成本和时间,而且写完之后,堆起来行云流水,转交给新的测试人员,也可以很快的入手,方便后期的维护测试。2.语法简单,功能强大,

缺点
语法全面,但是问题是语句太多了,造成写的东西比较多

describe(@"Team", ^{
    context(@"when newly created", ^{
        it(@"should have a name", ^{
            id team = [Team team];
            [[team.name should] equal:@"Black Hawks"];
        });

        it(@"should have 11 players", ^{
            id team = [Team team];
            [[[team should] have:11] players];
        });
    });
});
3.WIKI(属于BDD)

什么是WIKI?
WIKI是ios测试的开源库,测试用例都遵循三段式Given-When-Then的描述,清晰地表达测试用例是测试什么样的对象或数据结构,在基于什么上下文或情景,然后做出什么响应,报错的描述在前边,然后才是具体的逻辑判断,写完之后,就像是读一个句子一样,非常的方便,即使项目交给新的工程师,他们也会非常快速的接手测试

使用场景
应该是测试Case中

优点
统一化管理,书写代码,可以多次的进行回归测试,方便修改,节约成本和时间,而且写完之后,堆起来行云流水,转交给新的测试人员,也可以很快的入手,方便后期的维护测试。2.语法简单,功能强大,

缺点
语法全面,但是问题是语句太多了,造成写的东西比较多

4.GH+Unit

GH+Unit
一套可视化测试框架,可以在手机,或者电脑的控制台看到打印,更加人性化的服务

使用场景
应该是测试Case中

优点
GUI开发,可以一目了然看到项目中测试了什么项目,那些项目测试了,那些项目还没有测试!

缺点
没有过,我哪知道


Android篇*

以下是几种比较靠谱的测试框架

  • 1.NSAssert (断言,和普通代码在一起书写)
  • 2.WIKI,是从行为的角度思考问题。测试用例都遵循三段式Given-When-Then的描述,清晰地表达测试用例是测试什么样的对象或数据结构,在基于什么上下文或情景,然后做出什么响应。
  • 3.XCTest(Unit Test)(又称为模块测试, Unit Testing)单元测试非常适合用来做 app 的逻辑以及网络接口方面的测试,Xcode提供单元测试的是从测试的角度思考问题
  • 4.比如专注于提供 Mock 和 Stub 的 OCMock(建议使用GHUnit + OCMock组合进行单元测试)
  • 5.UITest

具体的使用方法和介绍

1.NSAssert(断言)

什么是断言?
程序运行时防止某些数据不符合预期,直接在使用数据的时候,对他用断言判断一下,保证数据的正确性

使用场景
在程序的任何位置,只要是对任何数据或者对象的怀疑,就可以对他们进行断言判断(只在debug模式开启,release默认关闭)

优点
和程序同步,当开发和测试人员使用app的时候,走到程序的任何位置,都时刻有断言给你保证你所使用的数据是符合你预期的,如有违背,直接就崩溃提醒,简单粗暴

当你要去使用一个变量的时候,你害怕他不对或者为空,通常你会判断一下

    GEUser * user =[GEUserTool userInfo];
    if (user.Token.length) {
        NSLog(@"用户的token不为空");
    }

这是我们正常的使用过程,没问题。如果测试测完了,说对,这很好,当下一个版本的时候,我们突然改动了些东西,这个位置的token为空了,测试又走到这里,没注意到无打印,那么这个隐藏的bug就这样放着,一直不会发现。我举得例子是比较小的,如果是个大的bug,测试忘了回归测试,责任是很大的,所以,为了保险起见,我们可以使用断言,哪怕测试没有发现,我们可以自定义的对错误做一个处理(自定义直接崩溃或者打印输出)!

    GEUser * user =[GEUserTool userInfo];
    NSAssert(user.Token.length != 0, @"用户的token不能是空的");
    if (user.Token.length) {
        NSLog(@"用户的token不为空");
    }

如果是这个样子,及时测试人员没有测试出来,系统会自动奔溃,打印出出错的断言的位置,方便我们调试,给开发人员和测试人员提供了诸多便利,具体内容请到我的另一篇文章看看详情.

2.UintTest(单元测试,属于TDD)

什么是单元测试?
苹果亲儿子,直接在app的UITestCase类中测试业务逻辑,集中化管理测试用例,将测试的对象设置成最小的单元,方便开发人员测试

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

优点

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

缺点
缺点是不能和UI交互,属于TDD类型,报错的描述在后面,不是特别容易理解,如果是项目转交给新的工程师,可能会费比较长的时间去理解测试用例

在TestCase中我们可以写很多的测试用例,可以一次性跑所有的,也可以一个一个来,可以试想一下,如果有50个网络接口,或者一些测试的判断,那么一口气跑下来,却都是对的,那多么的爽歪歪。
具体的内容可以参考我的另一篇文章 UITestCase 测试单元的使用

PS:感觉** NSAssertXCTAssert好像啊,语法基本一致,确实如此,只是他们的使用场景不同,一个是和普通代码在一起杂糅的写,时时刻刻判断数据,另一个是专门在TestCase类**中去判断数据或者对象是否符合自己的预期。

3.WIKI(属于BDD)

什么是WIKI?
WIKI是ios测试的开源库,测试用例都遵循三段式Given-When-Then的描述,清晰地表达测试用例是测试什么样的对象或数据结构,在基于什么上下文或情景,然后做出什么响应,报错的描述在前边,然后才是具体的逻辑判断,写完之后,就像是读一个句子一样,非常的方便,即使项目交给新的工程师,他们也会非常快速的接手测试

使用场景
应该是测试Case中

优点
统一化管理,书写代码,可以多次的进行回归测试,方便修改,节约成本和时间,而且写完之后,堆起来行云流水,转交给新的测试人员,也可以很快的入手,方便后期的维护测试。2.语法简单,功能强大,

缺点
语法全面,但是问题是语句太多了,造成写的东西比较多

describe(@"Team", ^{
    context(@"when newly created", ^{
        it(@"should have a name", ^{
            id team = [Team team];
            [[team.name should] equal:@"Black Hawks"];
        });

        it(@"should have 11 players", ^{
            id team = [Team team];
            [[[team should] have:11] players];
        });
    });
});
3.WIKI(属于BDD)

什么是WIKI?
WIKI是ios测试的开源库,测试用例都遵循三段式Given-When-Then的描述,清晰地表达测试用例是测试什么样的对象或数据结构,在基于什么上下文或情景,然后做出什么响应,报错的描述在前边,然后才是具体的逻辑判断,写完之后,就像是读一个句子一样,非常的方便,即使项目交给新的工程师,他们也会非常快速的接手测试

使用场景
应该是测试Case中

优点
统一化管理,书写代码,可以多次的进行回归测试,方便修改,节约成本和时间,而且写完之后,堆起来行云流水,转交给新的测试人员,也可以很快的入手,方便后期的维护测试。2.语法简单,功能强大,

缺点
语法全面,但是问题是语句太多了,造成写的东西比较多

4.GH+Unit

GH+Unit
一套可视化测试框架,可以在手机,或者电脑的控制台看到打印,更加人性化的服务

使用场景
应该是测试Case中

优点
GUI开发,可以一目了然看到项目中测试了什么项目,那些项目测试了,那些项目还没有测试!

缺点
没有过,我哪知道


网球家客户端要解决的问题

1.如何确定后台几十个接口返回数据是否符合我们的预期?
推荐使用 XCTest,(有异步处理的方法),或者使用WIKI

2.如何在项目中可以一直监视着系统的各种数据的正确性?
推荐使用NSAssert,在项目中的任何位置都可以随时监听数据的正确性,一旦和预期数据不同,我们可以打印,或者直接使项目崩溃

3.如何对UI界面用户操作做回归测试?
在iOS的框架中,UITest专门做UI层面的测试,可以多次回归,但是目前这种技术并不是特别的靠谱


写在最后
最后那,推荐一下onevcat(VVDocument的作者)关于测试的两篇文章,写的非常棒!
1.TDD的iOS开发初步以及Kiwi使用入门
2.Kiwi 使用进阶 Mock, Stub, 参数捕获和异步测试

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 关于iOS的UI自动化测试,是从Xcode7之后才支持的比较好,使用XCTest.framework,Xcode可...
    房小房MT阅读 5,207评论 4 13
  • 前言 如果有测试大佬发现内容不对,欢迎指正,我会及时修改。 大多数的iOS App(没有持续集成)迭代流程是这样的...
    默默_David阅读 1,644评论 0 4
  • 大多数的iOS App (没有持续集成)迭代流程是这样的: 也就是说,测试是发布之前的最后一道关卡。如果bug不能...
    伯牙呀阅读 4,864评论 1 22
  • 文章来自:http://blog.csdn.net/mj813/article/details/52451355 ...
    好大一只鹏阅读 9,186评论 2 126