iOS 单元测试之XCTest
Xcode集成了对测试的支持,其中单元测试使用的是XCTest框架 <XCTest/XCTest.h>
,良好的单元测试可以提高产品的稳定性,快速定位bug,节省开发时间。
XCTestCase
每个XCode创建iOS的工程中都有一个叫做 工程名Tests
的分组,这个分组里就是XCTestCase的子类,XCTest中的测试类都是继承自XCTestCase。
例如新建一个工程,命名为Demo,就能看到如图:

看一下这个自动创建的文件里都包含了哪些内容

测试用例的命名
XCTest中所有的测试用例的命名都是以test开头的。例如上文中的:
setUp和tearDown
setUp
是在所有测试用例运行之前运行的函数,在这个测试用例里进行一些通用的初始化工作
tearDown
是在所有的测试用例都执行完毕后执行的
XCode的测试用例导航
测试用例的导航如图,在测试用例的导航里,我们可以运行一组测试用例,也可以运行一个单独的测试用例

可以鼠标右键来新建一组测试用例。

也可以为测试用例添加失败断点来方便我们调试

普通方法测试
例如,新建一个类命名为Model,他有这个方法用来生成10以内的随机数。
|
|
于是,测试方法为
|
|
我们点击如图的左边图标单独运行这个测试用例,当然也可以在上文我提到的导航栏里单独运行。

然后会看到输出表示这个测试用例通过
|
|
常用断言
如何判断一个测试用例成功或者失败呢?XCTest使用断言来实现。
最基本的断言:表示如果expression满足,则测试通过,否则对应format的错误。
|
|
其他一些常用的断言:
|
|
性能测试
所谓性能测试,主要就是评估一段代码的运行时间,XCTest的性能的测试利用如下格式
|
|
例如,我要评估一段代码,这段代码的功能是把一张图片缩小到指定的大小。
这段代码如下,这段代码我放在UIImage的类别里。
|
|
然后测试用例如下,主要判断resize后是否为nil,并且尺寸是否对。
|
|
输出
|
|
异步测试
异步测试的逻辑如下,首先定义一个或者多个XCTestExpectation,表示异步测试想要的结果。然后设置timeout,表示异步测试最多可以执行的时间。最后,在异步的代码完成的最后,调用fullfill来通知异步测试满足条件。
|
|
举例
测试结果
|
|
注意点
- 使用pod的项目中,在XC测试框架中测试内容包括第三方包时,需要手动去设置 Header Search Paths 才能找到头文件 ,还需要设置test target的PODS_ROOT。
- Xcode7要使用真机做跑测试时,证书必须配对,否则会报错exc_breakpoint错误
- XCTestExpectation 的 fulfill 方法只能调用一次,系统不会帮你检查,如果你调用两次就会出错,而且你经常都找不到错在哪里。