iOS XCTest单元测试

一、概述

在Xcode中新建项目的时候会默认勾选单元测试,勾选后每个XCode新建的iOS的项目中都有一个叫做”项目名Tests”的分组,这个分组里就是XCTestCase的子类,XCTest中的测试类都是继承自XCTestCase。当我们为项目增加了新的功能时,可以使用单元测试针对该模块进行测试。

二、单元测试的使用

1、常规测试

首先新建一个名为“MyDemo”的项目,我们会看到会自动生成如下的文件:

image1

MyDemoTests中代码为:

#import <XCTest/XCTest.h>

@interface MyDemoTests : XCTestCase

@end

@implementation MyDemoTests

- (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];
}

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
}

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
    }];
}

@end

上面最重要的两个方法为setUp和tearDown,setUp方法在XCTestCase的测试方法调用之前调用。当测试全部结束之后调用tearDown方法。上面的另外两个方法是系统自动创建的功能测试用例的示例。我们可以自己创建测试方法,不过测试方法必须testXXX的格式,且不能有参数,不然不会识别为测试方法。

setUp方法可以在测试之前创建在test case方法中需要用到的一些对象等。tearDown方法则在全部的test case执行结束之后清理测试现场,释放资源删除不用的对象等。

例如,我们去除系统系统创建的两个测试用例的示例,我们自己创建一个方法:

#import <XCTest/XCTest.h>

@interface MyDemoTests : XCTestCase

@end

@implementation MyDemoTests

- (void)setUp {
    [super setUp];
    NSLog(@"setUp-----------------");
}

- (void)tearDown {
    [super tearDown];
    NSLog(@"tearDown-----------------");
}

- (void)testMyFun{
    NSLog(@"testMyFun-----------------");
}

@end

按快捷键Command + U进行单元测试,打印结果(去除了其他暂不关注的打印):

2017-03-06 15:35:35.336 MyDemo[48088:5078800] setUp-----------------
2017-03-06 15:35:35.336 MyDemo[48088:5078800] testMyFun-----------------
2017-03-06 15:35:35.337 MyDemo[48088:5078800] tearDown-----------------
接下来我们新建一个类MyClass,在MyClass中声明和实现一个getNum的方法,方法实现如下:

-(NSInteger)getNum{
    return 5;
}
然后在我们MyDemoTests的testMyFun写相关单元测试代码(代码中用到了断言,断言的使用后面再讲):

#import <XCTest/XCTest.h>
#import "MyClass.h"

@interface MyDemoTests : XCTestCase

@end

@implementation MyDemoTests

- (void)setUp {
    [super setUp];
    NSLog(@"setUp-----------------");
}

- (void)tearDown {
    [super tearDown];
    NSLog(@"tearDown-----------------");
}

- (void)testMyFun{
    NSLog(@"testMyFun-----------------");

    MyClass *myClass = [[MyClass alloc]init];
    NSInteger num = [myClass getNum];

    XCTAssert(num < 10,@"num should less than 10");
}

@end

上面加了断言,只有当num<10的使用才能通过测试,由于此时num=5,所以可以顺利通过测试。

按快捷键Command + U进行单元测试,结果如下:

image2

如果我们将getNum的返回结果改为15,则不会通过测试:

image3

如果测试方法比较多的时候也可以直接点击方法后运行的图标单独测试某个方法,Command + U是全部测试:

image4

2、性能测试

刚开始的时候系统为我们创建的一个测试用例方法里有这么个方法:

 - (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
    }];
}

测试代码

- (void)testPerformanceExample {
    NSLog(@"testPerformanceExample-----------------");

    [self measureBlock:^{

        MyClass *myClass = [[MyClass alloc]init];
        [myClass getNum];

    }];
}

按快捷键Command + U进行单元测试,结果如下:

2017-03-06 16:42:01.403 MyDemo[51107:5178923] setUp-----------------
2017-03-06 16:42:01.404 MyDemo[51107:5178923] testPerformanceExample-----------------
/Users/lifengfeng/Desktop/Project/iOSProject/MyDemo/MyDemoTests/MyDemoTests.m:31: Test Case '-[MyDemoTests testPerformanceExample]' measured [Time, seconds] average: 0.422, relative standard deviation: 164.533%, values: [0.000053, 2.073384, 0.000010, 1.073334, 0.000013, 1.074108, 0.000016, 0.000005, 0.000004, 0.000003], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100
2017-03-06 16:42:06.080 MyDemo[51107:5178923] tearDown-----------------

3、常用的测试断言

  • XCTFail(format) 生成一个失败的测试;

  • XCTFail(@"Fail");

  • XCTAssertNil(a1, format…) 为空判断, a1 为空时通过,反之不通过;

  • XCTAssertNil(@”not nil string”, @”string must be nil”);

  • XCTAssertNotNil(a1, format…) 不为空判断,a1不为空时通过,反之不通过;

  • XCTAssertNotNil(@”not nil string”, @”string can not be nil”);

  • XCTAssert(expression, format…) 当expression求值为TRUE时通过;

  • XCTAssert((2 > 2), @”expression must be true”);

  • XCTAssertTrue(expression, format…) 当expression求值为TRUE时通过;

  • XCTAssertTrue(1, @”Can not be zero”);

  • XCTAssertFalse(expression, format…) 当expression求值为False时通过;

  • XCTAssertFalse((2 < 2), @”expression must be false”);

  • XCTAssertEqualObjects(a1, a2, format…) 判断相等, [a1 isEqual:a2] 值为TRUE时通过,其中一个不为空时,不通过;

  • XCTAssertEqualObjects(@”1″, @”1″, @”[a1 isEqual:a2] should return YES”);

  • XCTAssertNotEqualObjects(a1, a2, format…) 判断不等, [a1 isEqual:a2] 值为False时通过,

  • XCTAssertNotEqualObjects(@”1″, @”1″, @”[a1 isEqual:a2] should return NO”);

  • XCTAssertEqual(a1, a2, format…) 判断相等(当a1和a2是 C语言标量、结构体或联合体时使用,实际测试发现NSString也可以);

  • XCTAssertNotEqual(a1, a2, format…) 判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);

  • XCTAssertEqualWithAccuracy(a1, a2, accuracy, format…) 判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/- accuracy )以内相等时通过测试;

  • XCTAssertEqualWithAccuracy(1.0f, 1.5f, 0.25f, @”a1 = a2 in accuracy should return YES”);

  • XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format…) 判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试;

  • XCTAssertNotEqualWithAccuracy(1.0f, 1.5f, 0.25f, @”a1 = a2 in accuracy should return NO”);

  • XCTAssertThrows(expression, format…) 异常测试,当expression发生异常时通过;反之不通过;

  • XCTAssertThrowsSpecific(expression, specificException, format…) 异常测试,当expression发生 specificException 异常时通过;反之发生其他异常或不发生异常均不通过;

  • XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format…) 异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;

  • XCTAssertNoThrow(expression, format…) 异常测试,当expression没有发生异常时通过测试;

  • XCTAssertNoThrowSpecific(expression, specificException, format…) 异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;

  • XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format…) 异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 单元测试不是一个小工程,需要多用些时间才能做好,不要希望通过这个文章就能掌握单元测试,这只是一个入门,需要自己动手...
    勇不言弃92阅读 7,781评论 9 60
  • 前言 单元测试和UI测试大致步骤网上很多文章都有,如果会的可以忽略,关键是错误总结,网上很少有文章提及到,感兴趣的...
    _YGL_阅读 5,145评论 20 23
  • 领导给的需求是: 关于单元测试的任务反馈: http://www.jianshu.com/p/d15a7dea0c...
    SOI阅读 4,005评论 1 34
  • 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块的最小单位来进行正确性检...
    iOS暮光阅读 347评论 0 0
  • 转自:http://www.jianshu.com/p/009844a0b9ed 什么是单元测试?一听到单元测试这...
    YYT1992阅读 851评论 0 2