Unit test 学习总结(二)

转载 2016年05月30日 15:30:02

这段时间在团队里一直在负责对单元测试的探索和落地,感觉有必要总结下自己这段时间的探索成果和大家分享。加之已经忙的很久没写博客了,感觉没有沉淀,这样不好。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方法的。OCMock 和 OCMockito个人感觉功能区别不大。他们之间的区别在于使用OCMock的库比OCMockito的库多,而且文档和教程更加丰富。大家可以打开OCMock官网看一下。所以个人选择我选了OCMock作为我们的测试mock工具。

Expecta Or OCHamcrest

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

原因有两点:

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

BDD Or Not

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

这个测试用例就是在说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是我认为最好的框架方案。当然,这是我的个人观点~


iOS单元测试:Specta + Expecta + OCMock + OHHTTPStubs + KIF

框架选择 参考这篇选型文章,http://zixun.github.io/blog/2015/04/11/iosdan-yuan-ce-shi-xi-lie-dan-yuan-ce-shi-kuan...
  • lihei12345
  • lihei12345
  • 2015年07月22日 18:14
  • 6937

UNIT TEST

1.在编写单元测试代码的时候,要注意如下几个方法(非常重要,以下都是以JUnit4为例): (1)测试方法上必须使用@Test进行修饰; (2)测试方法必须使用public void进行修饰,并且...
  • weixin_35854729
  • weixin_35854729
  • 2016年09月08日 16:41
  • 412

Mybatis学习总结二

1.传递pojo对象 Mybatis使用ognl表达式解析对象字段的值,如下例子: select * from user where id=#{id} and username lik...
  • u012730299
  • u012730299
  • 2016年05月20日 11:27
  • 421

Unit test学习总结

转自:http://www.blogjava.net/ldd600/archive/2009/09/04/293894.html 1.  测试什么: 1)      测试输出结果,测试返回结果的正...
  • Sasoritattoo
  • Sasoritattoo
  • 2013年11月24日 15:50
  • 1772

阶段学习总结

阶段学习总结 从开始学习java到现在已经过了40多天过去了,同时也学习了java中非常重要的一部分就是面向对象的相关知识,面向对象也是java中较难的一部分,因为它是一种抽象的思想,在这一个阶段的...
  • LS1910831673
  • LS1910831673
  • 2016年12月05日 18:59
  • 462

Android 开发学习小结(二)

一、activity的主要作用 1.用户和应用程序的交互接口类似于网站的展示层 2.一个Activity可以放多个控件,可以理解成一个控件的容器 二、创建一个Activity的要点 1.一个Ac...
  • cdy102688
  • cdy102688
  • 2015年02月26日 21:40
  • 247

Android 开发总结二

1.关于设备尺寸不同、分辨率不同等引起的界面变形问题: 问题:最近测试的时候发现在不同尺寸、不同分辨率的平板上,设计的Android界面显示效果不同,有些还完全变形了。 原因:经过检查程序,发现这...
  • changlei_shennan
  • changlei_shennan
  • 2015年03月25日 14:43
  • 345

Javaweb学习总结(二)

servlet的生命周期: Servlet运行在Servlet容器中,其生命周期由容器来管理。 每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法...
  • LL596214569
  • LL596214569
  • 2017年08月21日 14:35
  • 132

spring学习总结(二)

spring IoC容器(控制反转) 1.使用依赖注入(DI)管理应用程序组件2.容器 BeanFactory容器(为依赖注入DI提供支持) ApplicationContext 容器3.Bea...
  • qq_28198893
  • qq_28198893
  • 2017年11月28日 14:20
  • 39

Unit test 学习总结 (一)

1. 给原有的工程添加Unit Test Case Class 工程模版中可以找到相关的选贤。 2. 在新创建的文件编译时会出现找不到头文件的问题。需要在build setting中 Framewo...
  • binglan520
  • binglan520
  • 2016年05月27日 13:44
  • 171
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unit test 学习总结(二)
举报原因:
原因补充:

(最多只允许输入30个字)