iOS的单元测试
关于单元测试
单元测试的介绍可以自己搜索一下定义。 小项目可能比较少人用,觉得写起来麻烦。大中型项目的使用频率就特别高了。比较优秀的第三方库,例如AFNetwoking 也会用单元测试。单元测试是保证软件质量的非常好的重要手机。
我们这里介绍一下苹果自带的单元测试方法
集成
新建项目 的时候 有 Include Unit Tests,与 Include UI Tests,默认是打勾状态,这个就是单元测试。
注意:Unit Tests 主要是针对逻辑的测试,而UI Tests则主要是针对UI界面的测试。
有同学可能会问,如果项目开始没有集成测试,后面想集成怎么办?ok,那也很简单,你可以在TARGETS 选项里点“+”号,再选择Test,添加iOS UI Testing Bundle 或者iOS Unit Testing Bundle。
使用
现在已经集成进来了。我们先看一下UnitTestDemoTests,可以看到目录下有一个UnitTestDemoTests的.m文件,里面有默认有四个方法
这个方法每个测试方法开始都会先调用一次的,做初始化工作。
- (void)setUp
这个方法每个测试方法结束的时候都会掉用,做卸载工作。
- (void)tearDown
这个方法是一个测试方法的例子。
- (void)testExample
注意:我们每一个测试方法都需要以小写的test开头,当进行单元测试时候,系统会自动检测从XCTestCase继承的子类,并且以test开头的方法,把它们当做测试方法去运行。
这个方法也是测试方法
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
// Put the code you want to measure the time of here.
}];
}
因为是test开头的,所以说明它也是一个测试方法。需要注意的是这里面使用到了 measureBlock方法,这是一个性能测试方法。可以在block里写需要进行测试的代码,在左侧设置测试系数,
我们尝试一下在block里写测试代码。并且设置测试系数,基准线(Baseline)为1秒,偏差(STDDEV)为10%。
command+U运行单元测试
进行性能测试的方法会执行几次以求得平均值。
得到结果
得到运行平均时间1.001s,Rsult,有0.082% 的误差 在10%的偏差里,所以它并没有报错。
如果我们将block的测试代码修改一下
sleep(2)
再次运行单元测试,结果如下:
这次报了错误,可以很清楚地看到性能测试的结果。 例子写的非常简单,我们可以结合自己的具体业务进行对应的性能测试。
除了性能测试,我们更多的是进行逻辑的正确性的测试。这个时候就需要用到断言。测试框架给我们提供了许多判断条件的断言。可以针对实际情况进行使用。
常见的有:
XCTAssertTrue()
XCTAssertFalse()
XCTAssertNil()
XCTAssertNotNil()
XCTAssertEqual()
XCTAssertEqualObjects()
XCTAssertNotEqual()
XCTAssertNotEqualObjects()
例如我们有个变量,在进行逻辑处理的时候,需要判断它是否为nil,这个时候可以使用
-(void)testDemo
{
NSObject *myVar;
//具体业务
XCTAssertNotNil(myVar);
}
注意:我们直接运行上面的代码,会测试失败,因为myVar没有赋值,为nil,这个断言是判断myVar不为nil才测试成功。
单元测试最常见的一个场景是用来测试接口。我们可以为每个接口定义一个测试用例。修改功能之后跑一遍所有的接口,以测试我们新增加或者修改的功能对原功能有没有影响。
关于UI Test
UI的交互测试,一般用的比较少,以前是用instrument 在里面录制行为变成js代码。xcode7 提供了直接在xcode里面可以进行录制的功能,录制生成的代码是原生的代码。待续