[iOS单元测试系列]单元测试框架选型

这段时间在团队里一直在负责对单元测试的探索和落地,感觉有必要总结下自己这段时间的探索成果和大家分享。加之已经忙的很久没写博客了,感觉没有沉淀,这样不好。iOS单元测试系列会一直更新,按主题将我在单元测试探索和落地过程中的技术积累沉淀下来,也算是对自己这段时间的总结。部分观点是我个人观点,欢迎大家讨论。

一开始接到的不是单元测试的任务,而是与测试同学共建完成iOS上持续集成能跑测试用例的平台。然后我就吭哧吭哧的区研究Jenkins,后来发现不对,就算我把平台搭建好了没有测试用例也只是个空壳子,而应该合理分工,测试同学负责搭建平台,开发负责写测试用例。

XCTest Or GHUnit

写测试用例总得有个框架吧,现在比较流行的就属Apple自带的XCTest和第三方的GHUnit。我们来看看他两之间的区别。 XCTest:与Xcode深度集成。而且可以享受Apple后续对XCTest升级的福利。 GHUnit:集成度不如XCTest,安装麻烦。但是有自己的GUI界面。 貌似都各有所长,那么我们来看看Github上的一些知名的开源库都用的是什么测试框架吧。

可以看到清一色的被XCTest刷屏了。也的确,GHUnit的GUI界面对我们来说没有什么特别大的意义。而XCTest血统纯正,背后站着东家Apple。而对于我们的选择也应该是XCTest,应该既然Github上又这么多XCTest的case例子可以参考,对我们的帮助肯定不言而喻。

OCMock Or OCMockito

这两个都是用来mock对象,stub方法的。OCMockOCMockito个人感觉功能区别不大。他们之间的区别在于使用OCMock的库比OCMockito的库多,而且文档和教程更加丰富。大家可以打开OCMock官网看一下。所以个人选择我选了OCMock作为我们的测试mock工具。

Expecta Or OCHamcrest

ExpectaOCHamcrest这两个都是断言的扩展框架。一开始我选择了Expecta,因为我后来有一段时间将测试文件用BDD框架Specta来写(当然这是后话),而Expecta 和Specta都出自同一个人之手,不论是教程文档都更加丰富。但是后来我废弃了BDD框架,还是用原生的XCTest,Expecta在使用中也遇到了一些问题,我就把我们的断言框架由Expecta切换到了OCHamcrest。

原因有两点:

1.Expecta不成熟,至笔者切换的时候才0.3.1版本,遇到很多框架自身的问题。case跑着跑着验证通不过了,再跑一次又过了,是不是还爆出个Expecta框架内部的crash。

2.OCHamcrest更加成熟,而且可扩展性高,可以自定义自己的断言,更灵活。

比如OCHamcrest不支持superClass验证,我们必须自己去比较,返回一个bool值,然后去判断bool是否为真。很麻烦。自己自定义个superClass的验证,就不需要每次都这么麻烦的写这么多代码了。而如果Expecta不支持的断言,那就永远不能支持了。 我们可以通过OCHamcrest这个特性,做一些符合自己app场景的特有断言。

BDD Or Not

BDD的全称是Behavior Driven Development。也就是行为驱动开发。BDD确实让我眼前一亮。他能将测试语言写成类似自然语言。BDD的理念是你不是在写代码,而是在讲故事。而整个故事是由Given…When…Then组成。我们可以来看看BDD框架Kiwi的一段测试代码:

12345678910111213

describe(@"Team",^{context(@"when newly created",^{it(@"has a name",^{idteam=[Teamteam];[[team.nameshould]equal:@"Black Hawks"];});it(@"has 11 players",^{idteam=[Teamteam];[[[teamshould]have:11]players];});});});

这个测试用例就是在说Given a Team,When newly created,it should have a name, and should have 11 players。 的确很清晰,基本不需要注释就能知道在干嘛了。 既然BDD这么好,那么我们比较下BDD框架Kiwi和XCTest + OCMock组合的优劣吧。为什么是XCTest + OCMock而不是XCTest,因为Kiwi自带mock功能,而XCTest没有mock功能。

可以看出Kiwi还是蛮诱人的。但是Kiwi的mock功能api远没有OCMock设计的好,尤其是OCMock3推出后,所以笔者想把Kiwi和OCMock一起用,结果这两个库存在不兼容性。一跑就挂。后来迁移到BDD另一个框架Specta,BDD的理念相同,所以语法也大同小异。Specta和Kiwi的区别就是Kiwi包含了Specta和OCmock以及Expeata所有的功能。换句话说Specta就是没有mock和验证功能的kiwi。但是想对来说,specta的API设计更加合理。

但是,高潮来了!后续我还是废弃了BDD,切换回XCTest,原因有很多。主要的原因是BDD框架hold不住业务的发展,BDD的讲故事理念在业务面前就是老太太的裹脚布,又臭又长!而且BDD需要一定的学习成本,不像XCTest这种类JUnit的对开发者更友好的代码。而且BDD的框架包装过深,可扩展性不高。还有就是BDD的框架普遍太年轻,bug相对较多,版本迭代太快。最最致命的是BDD的框架不能单个case单个跑,一跑所有的case全部跑一边这在平时写case 的时候是非常拖沓的!

总结

也没啥好总结的。一个个坑踩下来,最后的选择是XCTest + OCMock + OCHamcrest是我认为最好的框架方案。

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

推荐阅读更多精彩内容