TDD的iOS开发初步以及Kiwi使用入门

发表于:2014-2-24 11:06

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:OneV\\\'s Den    来源:51Testing软件测试网采编

  为什么我们要test
  而TDD是一种相对于普通思维的方式来说,比较极端的一种做法。我们一般能想到的是先编写业务代码,也就是上面例子中的add方法,然后为其编写测试代码,用来验证产品方法是不是按照设计工作。而TDD的思想正好与之相反,在TDD的世界中,我们应该首先根据需求或者接口情况编写测试,然后再根据测试来编写业务代码,而这其实是违反传统软件开发中的先验认知的。但是我们可以举一个生活中类似的例子来说明TDD的必要性:有经验的砌砖师傅总是会先拉一条垂线,然后沿着线砌砖,因为有直线的保证,因此可以做到笔直整齐;而新入行的师傅往往二话不说直接开工,然后在一阶段完成后再用直尺垂线之类的工具进行测量和修补。TDD的好处不言自明,因为总是先测试,再编码,所以至少你的所有代码的public部分都应该含有必要的测试。另外,因为测试代码实际是要使用产品代码的,因此在编写产品代码前你将有一次深入思考和实践如何使用这些代码的机会,这对提高设计和可扩展性有很好的帮助,试想一下你测试都很难写的接口,别人(或者自己)用起来得多纠结。在测试的准绳下,你可以有目的有方向地编码;另外,因为有测试的保护,你可以放心对原有代码进行重构,而不必担心破坏逻辑。这些其实都指向了一个最终的目的:让我们快乐安心高效地工作。
  在TDD原则的指导下,我们先编写测试代码。这时因为还没有对应的产品代码,所以测试代码肯定是无法通过的。在大多数测试系统中,我们使用红色来表示错误,因此一个测试的初始状态应该是红色的。接下来我们需要使用最小的代价(最少的代码)来让测试通过。通过的测试将被表示为安全的绿色,于是我们回到了绿色的状态。接下来我们可以添加一些测试例,来验证我们的产品代码的实现是否正确。如果不幸新的测试例让我们回到了红色状态,那我们就可以修改产品代码,使其回到绿色。如此反复直到各种边界和测试都进行完毕,此时我们便可以得到一个具有测试保证,鲁棒性超强的产品代码。在我们之后的开发中,因为你有这些测试的保证,你可以大胆重构这段代码或者与之相关的代码,最后只需要保证项目处于绿灯状态,你就可以保证代码没重构没有出现问题。
  简单说来,TDD的基本步骤就是“红→绿→大胆重构”。
  使用XCTest来执行TDD
  Xcode 5中已经集成了XCTest的测试框架(之前版本是SenTestingKit和OCUnit),所谓测试框架,就是一组让“将测试集成到工程中”以及“编写和实践测试”变得简单的库。我们之后将通过实现一个栈数据结构的例子,来用XCTest初步实践一下TDD开发。在大家对TDD有一些直观认识之后,再转到Kiwi的介绍。如果您已经在使用XCTest或者其他的测试框架了的话,可以直接跳过本节。
  首先我们用Xcode新建一个工程吧,选择模板为空项目,在Product Name中输入工程名字VVStack,当然您可以使用自己喜欢的名字。如果您使用过Xcode之前的版本的话,应该有留意到之前在这个界面是可以选择是否使用Unit Test的,但是现在这个选框已经被取消。
  
  新建工程
  新建工程后,可以发现在工程中默认已经有一个叫做VVStackTests的target了,这就是我们测试时使用的target。测试部分的代码默认放到了{ProjectName}Tests的group中,现在这个group下有一个测试文件VVStackTests.m。我们的测试例不需要向别的类暴露接口,因此不需要.h文件。另外一般XCTest的测试文件都会以Tests来做文件名结尾。
 
  Test文件和target
  运行测试的快捷键是?U(或者可以使用菜单的Product→Test),我们这时候直接对这个空工程进行测试,Xcode在编译项目后会使用你选择的设备或者模拟器运行测试代码。不出意外的话,这次测试将会失败,如图:
 
  失败的初始测试
  VVStackTests.m是Xcode在新建工程时自动为我们添加的测试文件。因为这个文件并不长,所以我们可以将其内容全部抄录如下:
#import<XCTest/XCTest.h>
@interfaceVVStackTests:XCTestCase
@end
@implementationVVStackTests
-(void)setUp
{
[supersetUp];
//Putsetupcodehere.Thismethodiscalledbeforetheinvocationofeachtestmethodintheclass.
}
-(void)tearDown
{
//Putteardowncodehere.Thismethodiscalledaftertheinvocationofeachtestmethodintheclass.
[supertearDown];
}
-(void)testExample
{
XCTFail(@"Noimplementationfor\"%s\"",__PRETTY_FUNCTION__);
}
@end
52/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号