IOS开发学习之单元测试

一、软件测试分类

1、单元测试:测试范围小,仅仅测试一个小单元(如方法、函数不对的,对软件稳定有很大帮助)

2、集群测试:测试范围比较大,测试项目中的所有的功能

3、压力测试:模拟大批量数据/大数量的用户

单元测试的好处,即在测试文件中可以对某个正式方法进行测试,而不需要在正式文件中修改加测试,即文件和方法的测试分离。

二、单元测试学习

新创建一个项目,iOS默认会自带单元测试:
IOS开发学习之单元测试

测试文件继承了测试类:XCTestCase
IOS开发学习之单元测试

1.测试驱动开发

1.0测试类方法

1.1 先创建一个类,IWMathTool.h,并写一个简单的求和方法

//
//  IWMathTool.h
//  0820单元测试
//
//  Created by Corwien on 16-8-20.
//  Copyright (c) 2016年 Corwien. All rights reserved.
//  测试驱动开发

#import <Foundation/Foundation.h>

@interface IWMathTool : NSObject

/**
 * 计算两个整数的和
 */
+(int)sumWithNum1:(int)num1 num2:(int)num2;
@end

1.2 然后在测试文件中引入该类,并创建该类的测试方法:

单元测试的方法名必须以 test开头

//
//  _820____Tests.m
//  0820单元测试Tests
//
//  Created by kaiyi on 16-8-20.
//  Copyright (c) 2016年 kaiyi. All rights reserved.
//

#import <XCTest/XCTest.h>
#import "IWMathTool.h"   // 引入需要测试的类文件
@interface _820____Tests : XCTestCase

@end

@implementation _820____Tests

/**
 单元测试2大颜色:
 1、红色:测试失败
 2、绿色:测试通过
 */
- (void)setUp
{
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown
{
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}


/**
 * 单元测试的方法名必须以 test开头
 */
-(void)testMath
{
    int sum = [IWMathTool sumWithNum1:20 num2:10];
    
    // 断言/猜测/估计
    XCTAssertEqual(30, sum, @"IWMathTool方法有错");
}

- (void)testExample
{
    XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
}

@end

1.3 点击需要测试的方法testMath前边的运行按钮,即可进行测试:

IOS开发学习之单元测试

1.4 测试结果

单元测试2大颜色:
1、红色:测试失败
2、绿色:测试通过
IOS开发学习之单元测试

根据测试错误分析,发现该方法还没有实现:

IOS开发学习之单元测试

IWMathTool.m中实现该方法:

#import "IWMathTool.h"

@implementation IWMathTool

+(int)sumWithNum1:(int)num1 num2:(int)num2
{
    return num1 + num2;
}
@end

然后再次测试,亮了绿灯,测试通过 ^_^
IOS开发学习之单元测试

单元测试可以在一个测试方法中包含多个方法进行测试:

/**
 * 单元测试的方法名必须以 test开头
 */
-(void)testMath
{
    int sum = [IWMathTool sumWithNum1:20 num2:10];
    
    // 断言/猜测/估计
    XCTAssertEqual(30, sum, @"IWMathTool方法有错");
    
    // 断言测试,期望为TRUE,否则返回提示语句,isPositive是否为正数
    XCTAssertTrue([IWMathTool isPositive:10], @"IWMathTool方法有错");
}

2.一个类对应一个单元测试文件

有时候一个类的方法比较多,如果都写在一个测试文件中就显得比较凌乱,所以,这里可以对多方法的类单独写一个测试单元文件。

下面就以IWUser.h类做示例:

2.1 新建一个IWUser.h类

2.2 为User类新建一个单元测试类

先选择Object-C test case Class类型的类
IOS开发学习之单元测试

然后继承XCTestCase
IOS开发学习之单元测试

引入#import "IWUser.h"即可进行单元测试

//  IWUserTest.m
//  0820单元测试
#import <XCTest/XCTest.h>
#import "IWUser.h"

@interface IWUserTest : XCTestCase

@end

@implementation IWUserTest

- (void)setUp
{
    [super setUp];
  
}

- (void)tearDown
{
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample
{
    
    XCTAssertNotNil([IWUser user], @"user方法返回为空");
}

@end

三、单元测试的好处

1.把测试的类代码独立到测试的文件中,业务代码和测试代码完全分离,打包发布程序测试代码也不会包含在内,发布程序不用删除测试代码。
2.方法正确与否马上就能根据颜色看到反馈,不用看打印的结果。
3.单元测试非常轻量级、快捷,只需要测试运行某个方法,而不用整个项目都Run起来,因为有时Run整个项目很耗时。

注意,单元测试只能测一些业务方法,UI是不能测试的。

如果以前没有单元测试,可能写好一个方法之后,然后再去在正式的类文件中进行赋值测试,或者等方法出错了才来修改,或者隔一段时间再次进行赋值重复测试,这样非常麻烦,所以,建议以后在项目中用单元测试。