Crazyydevil的博客 记录代码人生

iOS的单元测试(一)

2016-09-08

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里面可以进行录制的功能,录制生成的代码是原生的代码。待续


Similar Posts

Comments