所谓单元测试(又称为模块测试, Unit Testing)就是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。
其实在我们开发的程序实现某个功能的时候我们也有进行测试。只不过,你是在项目代码中直接写的方法,而且在测试的时候,也是点点点,点到相应的界面才触发相应的方法,进行测试,这测试效率,想想也是醉了,不过还好能正常测试,但是如果你想控制不同的输入参数呢?好,你说直接写入到程序。但是,你测试完成了之后呢?好,你说那就注释掉啊。但是,如果后面你改动了又需要再测试一此呢?其实,说了这么多,就是想说,在你的有效工程代码外写测试代码,这就是单元测试了,完成后,一个Command+U直接进入入口进行代码测试。
接下来就是怎么进行代码测试,这个网络一搜一大堆,但是都是在那个test.m文件里面直接写写写得节奏,看了你肯定会问,就在这里写一些判断1+1=?2的代码?这什么情况。其实不是这样子的。按照目前Xcode的版本创建是这样子的:
1、直接创建项目,默认就已经有了那个所谓的TestOCUnitTestTests.m文件,创建完成之后如下,你直接看到了一个TestOCUnitTestTests.m文件,那个就是放测试代码的文件了。
2、点击你平时运行项目的那个三角形右边的TestOCUnitTest可以看到新出来三个选项,new一个Scheme,然后把项目切换到TestOCUnitTestTests里面,按住Command+U,会弹出一个Test Succeeded的提示框,表示成功。
3、接下来说说怎么测试我们项目里面的某个类的方法,我们随便在自己的某个类新建一个方法,我就选在MasterViewController这个类里面好了。具体实现的方法是在接收到的字符串用[]包住,然后返回,代码如下:
- (NSString *)getTestString:(NSString *)normalStr{ return [NSString stringWithFormat:@"[%@]",normalStr]; }
记得声明成外部可调用方法!
4、在TestOCUnitTestTests.m文件里面调用这个方法:
- (void)testExample { //1、找一个你需要进行单元测试的类,实例化 MasterViewController *controller = [[MasterViewController alloc]init]; NSString *normalStr = @"Objective-C"; NSString *expectStr = @"[Objective-C]"; //2、调用该对象需要进行单元测试的方法 NSString *returnStr = [controller getTestString:normalStr]; //3、断言你预想中得返回值及实际返回值是否符合 NSLog(@"Is MasterViewController testStr getRightStr:"); XCTAssertEqualObjects(expectStr,returnStr, @"pass"); }
可以运行之后,可以看到方法左边打了个钩钩,说明测试是通过的。(PS:写在TestOCUnitTestTests.m里面的所有方法会默认执行,不用你手工去调用)
如果你测试的是你项目中的其他方法,那么直接在在TestOCUnitTestTests.m里面直接创建测试方法,传参后断言测试返回数据是否跟预期的一样就行了,以上就是单元测试的使用。
对于一些常用的断言测试函数,我直接拷贝过来好了,如下所示:
XCTFail(format…) 生成一个失败的测试;
XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过;
XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;
XCTAssert(expression, format...)当expression求值为TRUE时通过;
XCTAssertTrue(expression, format...)当expression求值为TRUE时通过;
XCTAssertFalse(expression, format...)当expression求值为False时通过;
XCTAssertEqualObjects(a1, a2, format...)判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过;
XCTAssertNotEqualObjects(a1, a2, format...)判断不等,[a1 isEqual:a2]值为False时通过;
XCTAssertEqual(a1, a2, format...)判断相等(当a1和a2是 C语言标量、结构体或联合体时使用, 判断的是变量的地址,如果地址相同则返回TRUE,否则返回NO);
XCTAssertNotEqual(a1, a2, format...)判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/-accuracy)以内相等时通过测试;
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试;
XCTAssertThrows(expression, format...)异常测试,当expression发生异常时通过;反之不通过;(很变态) XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试;
XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过