相信读到这个标题的人都会有一个疑问,那就是什么是单元测试,单元测试有什么用,下面小编引用wiki百科中的解释,在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块的最小单位来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
那么我们为什么要使用单元测试,首先单元测试并不需要对应用进行编译测试速度很快,其次单元测试可以更早的发现程序实现的逻辑问题,最后,单元测试引入之后基本不需要经常进行维护而且测试稳定因此提高了测试效率。我们目前能使用到的基本就是苹果官方提供的XCTest工具,它属于xcode自带的工具因此不必担心被苹果干掉的情况。首先我们用xcode打开自己的项目,看右侧的导航栏当中有没有XXXTests和XXXUITests文件
其实在我们新建工程的时候就可以为我们的工程选择是否带上单元测试,如下图:
如果你的项目没有上面说的两个文件,你可以通过新建一个Target的方式添加,如下图:
在test下选择你项目没有的便可:
鉴于今天的主题是单元测试,我们就主要针对XXXTests这个进行讲解。XXXTests的.m文件里面默认有4个方法,这个文件里面主要做一些逻辑的测试。
这里简单介绍一下这四个方法都是做什么的:
Setup:每个test方法执行前调用,在这个测试用例里进行一些通用的初始化工作
Teardown:每个test方法执行后调用
testExample:测试方法样例
testPerformanceExample:这个方法主要是做性能测试的,所谓性能测试,主要就是评估一段代码的运行时间。
测试用例方法非常简单,从testExample这个方法我们大概知道怎么写了,方法名只需要以test开头即可。比如我们原本的项目中有一个返回bool值的方法,该方法判断字符串是否符合要求:
接下来我们为这个方法写一个测试方法
接下来点击测试方法右侧的菱形icon就可以进行测试了,通过测试的方法右侧菱形会变为绿色,未通过的将会变为红色,到这里测试用例的书写方式已经OK,接下来要给大家介绍测试中的重点,断言的使用,
XCTests为我们提供封装好的断言,如下所示:
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语言标量、结构体或联合体时使用,实际测试发现NSString也可以);
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没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
当然上述断言可能在某些场景并不能完全满足大家的需求,不过该框架的使用远远不是我上述介绍的这么简单,大家如果有兴趣可以更深入的研究并发掘出更多的内容。
浙公网安备 33010602011771号