看到文章标题的时候,你也许会问,测试不是测试妹子干的事吗?的确,测试妹子能帮助我们测试出软件的很多问题(不符合业务的问题),但是代码的测试还得靠我们自己啊。团队Leader在开会时一直强调要打造一支不依靠测试团队的团队,因此,代码自测也变成了一个项目重要的一环。是的,今天我要聊的就是我们程序员对自己代码的测试,而不是测试妹子的测试。在iOS开发中我们用单元测试来保证我们的代码可靠性,什么是单元测试,请看在维基百科上的解释:
在计算机编程中,单元测试(英语:UnitTesting)又称为模块测试,是针对程序模块的最小单位来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。--维基百科
有了单元测试以后,我们就没必要为了测试某个小模块去编译我们的程序,然后去等待模拟器启动然后到你需要验证的模块去。这样做也是可以的啦!可是,你的项目很大,编译等老半天,你的电脑没那么快,那就够你等的了。我还记得我工作的第一个公司,给我用的是一个性能堪忧的Macmini,每次修改代码后Command+R后都得等上一分多,简直不能忍受啊!是的,我没能忍受,没过多久我就离职了。扯淡这么半天,就是为了说明单元测试能节约我们的时间,提高开发效率,对于项目越大的效果越明显。
XCTest
XCode4.x时代Xcode集成的是OCUnit,到了XCode5.x时代就升级为了XCTest,并且到了XCode7时代还有了进行UI测试的能力。除了官方自带的,还有一些比较出名的第三方的测试框架,如:GHUnit,KiWi,OCMock,Specta等,当然本文不讨论这些第三方框架。怎么知道我们的项目有没有加上单元测试,用Xcode打开你的项目,看文件导航栏有没有类似下图的两个文件夹(TestDemo是工程名)。
其实在我们新建工程的时候就可以为我们的工程选择是否带上单元测试,如下图:
如果你的项目没有上面说的两个文件,你可以通过新建一个Target的方式添加,如下图:
在test下选择你项目没有的便可:
在这2个文件夹目录下分别都有2个文件,一个.m文件和一个plist文件。并且.m文件有4个方法,如下图:
项目名+Test的.m文件里面默认有4个方法,这个文件里面主要做一些逻辑的测试。项目名+UITest的.m文件里默认有3个方法。这个文件里面主要做一些UI的测试。说了这么半天,该如何写单元测试呢?在讲解如何写测试方法前,先说说默认的方法是干什么的吧!
//TestDemoTest.m -(void)setUp{ [supersetUp]; //每个test方法执行前调用,在这个测试用例里进行一些通用的初始化工作 //Putsetupcodehere.Thismethodiscalledbeforetheinvocationofeachtestmethodintheclass. } -(void)tearDown{ //Putteardowncodehere.Thismethodiscalledaftertheinvocationofeachtestmethodintheclass. [supertearDown]; //每个test方法执行后调用 } -(void)testExample{ //测试方法样例 //Thisisanexampleofafunctionaltestcase. //UseXCTAssertandrelatedfunctionstoverifyyourtestsproducethecorrectresults. } -(void)testPerformanceExample{ //这个方法主要是做性能测试的,所谓性能测试,主要就是评估一段代码的运行时间。该方法就是性能测试方法的样例。 //Thisisanexampleofaperformancetestcase. [selfmeasureBlock:^{ //Putthecodeyouwanttomeasurethetimeofhere. }]; } |
测试用例方法非常简单,从testExample这个方法我们大概知道怎么写了吧!方法名只需要以test开头,是的,就是这么简单。现在我们模拟登录这个功能来写一个登录模块的测试用例吧,Demo代码在GitHub,在User这个模型类里面一个方法叫isChinese的,是用来判断字符串里面是否有中文的。
#import<Foundation/Foundation.h> @interfaceUser:NSObject @property(nonatomic,copy)NSString*userName; @property(nonatomic,copy)NSString*passWord; /** *判断字符串中是否有中文 */ -(BOOL)isChinese:(NSString*)string; @end |
现在我们通过Xcode的File->New->File->Source选择UnitTestCaseClass来新建一个UserTests,注意要继承XCTestCase类。