浅谈iOS单元测试

什么是单元测试?

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。

iOS中单元测试有什么意义?

大型项目开发,功能比较繁琐,代码量比较大,调试某一块功能需要不断的Command+R运行调试,很显然这样的功能是非常非常的低效的,编写过程中以及App功能完成后为检测某一块功能,利用单元测试更有针对性的测试功能。两个字——高效!

添加单元测试

1.新工程默认会勾选

浅谈iOS单元测试_第1张图片

2.为老工程添加单元测试
点击File—–>New——->Target
浅谈iOS单元测试_第2张图片

熟悉单元测试类

浅谈iOS单元测试_第3张图片
UnitTestsDemoTests类是继承与 XCTestCase的

#import <XCTest/XCTest.h>

@interface UnitTestsDemoTests : XCTestCase

@end

@implementation UnitTestsDemoTests

- (void)setUp {
    [super setUp];
    /** * 每个test方法执行之前调用 * */
}

- (void)tearDown {
    [super tearDown];
    /** * 每个test方法执行之后调用 */
}

- (void)testExample {
    /** * 命名为Example的测试方法 */
}

- (void)testPerformanceExample {
    //主要检测代码的执行性能
    [self measureBlock:^{

    }];
}

@end

Xcode7默认带了测试性能的方法- (void)testPerformanceExample很有意思的一个方法

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
        for(int i=0;i<1000;i++)
        {
            NSLog(@"%d",i);
        }
    }];
}

重复执行上面的代码,会收集每次执行的时间,并计算出平均值,每次执行后会跟平均值进行比较,给你参考性的提示。

浅谈iOS单元测试_第4张图片

当我们把i的值后面增添一个0有意思一幕发生

浅谈iOS单元测试_第5张图片

XCode检测到这一次运行,远超过了平均值,给出了红色的警告,是不是感觉XCode太强大了?

认识测试符号

这里写图片描述警告不通过符号,说明这个模块出现问题

这里写图片描述通过符号,表示这个模块没有问题

自定义测试方法

  1. 自定义测试方法必须以test方法名开头(testXXX),例如上面的testExample

  2. 自定义方法必须为void返回类型
    -(void)testFloatEqual{}

单元测试常用的宏

XCTAssertEqualObjects(a1, a2, description, …)

XCTAssertEquals(a1, a2, description, …)

XCTAssertEqualsWithAccuracy(a1, a2, accuracy,description, …)

XCTFail(description, …)

XCTAssertNil(a1, description, …)

XCTAssertNotNil(a1, description, …)

XCTAssertTrue(expr, description, …)

XCTAssertTrueNoThrow(expr, description, …)

XCTAssertFalse(expr, description, …)

XCTAssertFalseNoThrow(expr, description, …)

XCTAssertThrows(expr, description, …)

XCTAssertThrowsSpecific(expr, specificException, description, …)

XCTAssertThrowsSpecificNamed(expr, specificException, aName, description, …)

XCTAssertNoThrow(expr, description, …)

XCTAssertNoThrowSpecific(expr, specificException, description, …)

XCTAssertNoThrowSpecificNamed(expr, specificException, aName, description, …)

Come on 动起来

普通测试

-(void)testFloatEqual{
    NSLog(@"这是自定义的测试方法");
    float a=100.00;
    XCTAssertEqual(a, 100.00,@"测试不通过");
}

类测试

先在XCode创建一个类名为PersonModel ,添加一个属性名为name

@interface PersonModel : NSObject
@property(nonatomic,strong)NSString *name;

@end
@implementation PersonModel
-(id)init
{
    if (self=[super init]) {
        _name=@"单元测试";
    }
    return self;
}
@end
  1. 在测试单元创建一个类
    浅谈iOS单元测试_第6张图片

  2. 点击右键,New Test Class
    浅谈iOS单元测试_第7张图片
    注意此类继承与XCTestCase

  3. 在头文件中引入#import "PersonModel.h"

  4. 自定义一个测试方法

-(void)testClassName { PersonModel *perModel=[[PersonModel alloc]init]; XCTAssertEqual(perModel.name, @"单元测试",@"name跟预期的不相等呀"); }

今天写了好多模块功能,检测下都是否正常


真开心,利用单元测试检测,都正常,开开心心下班去。O(∩_∩)O

你可能感兴趣的:(ios,单元测试,测试)