浅谈iOS单元测试

什么是单元测试?

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

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

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

添加单元测试

1.新工程默认会勾选

2.为老工程添加单元测试
点击File—–>New——->Target

熟悉单元测试类


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

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


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

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. 在测试单元创建一个类
  2. 点击右键,New Test Class

    注意此类继承与XCTestCase
  3. 在头文件中引入#import "PersonModel.h"
  4. 自定义一个测试方法
-(void)testClassName
{
    PersonModel *perModel=[[PersonModel alloc]init];
    XCTAssertEqual(perModel.name, @"单元测试",@"name跟预期的不相等呀");
}

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


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

时间: 2024-10-24 19:19:29

浅谈iOS单元测试的相关文章

浅谈iOS Crash(一)

本文讲的是浅谈iOS Crash(一),一.捕获iOS Crash 1.设置异常断点并运行 设置异常断点.png 说明:设置Xcode异常断点后运行程序,发生Crash时,断点会定位到出错的代码行,但仅适用于开发阶段.线上APP的Crash还需要通过收集Crash机制来捕获Crash并记录在日志中. 2.Mach异常 和 Unix信号 iOS Crash发生时,先产生Mach异常(最底层的内核级异常),然后Mach异常在host层被ux_exception转换为相应的Unix信号,并通过thre

浅谈iOS Crash(二)

浅谈iOS Crash(一) 一.僵尸对象(Zombie Objects) 1.概述 僵尸对象:已经被释放掉的对象.一般来说,访问已经释放的对象或向它发消息会引起错误.因为指针指向的内存块认为你无权访问或它无法执行该消息,这时候内核会抛出一个异常( EXC ),表明你不能访问该存储区域(BAD ACCESS).(EXC_BAD_ACCESS类型错误) 调试解决该类问题一般采用NSZombieEnabled(开启僵尸模式). 2.使用NSZombieEnabled Xcode提供的NSZombie

IOS中 浅谈iOS中MVVM的架构设计与团队协作

今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与

浅谈iOS的多Window处理

概述 想必做iOS的人都知道,我们的App是通过UIWindow这个载体呈现出来的.默认情况下,iOS App对于开发者来说只有一个UIWindow,也就是AppDelegate在applicationDidFinishLaunching里面创建出来的. 但是即使我们什么都不做,在我们的APP里面也会有其他的UIWindow: 键盘对应的UITextEffectWindow 状态栏对应的UIStatusBarWindow(准确来说这个Window并不隶属于我们的App) 只不过上述两种UIWin

浅谈iOS和Android的产品交互设计:iPhone和Android的控件对比

一. 前言 开发者在产品上同时覆盖iOS平台和Android平台时,则会遇到同一个功能在不同平台中界面和交互如何展现的问题. 了解两个平台间的控件对应关系和异同点,对同时面向两个平台的产品和交互设计是有帮助的. 此部分就两个平台的控件进行对应,并辅以一定的描述,更详细的控件说明和适用的场合请直接参阅参考资料中的相关文档. 说明:Android中的系统控件会根据不同的ROM和操作系统版本有所变化,本文中Android控件以<Android Design>为主要参考. 二.目的 本文期望表达的含义

浅谈iOS中三种生成随机数方法_IOS

ios 有如下三种随机数方法: //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(time(0)); int i = random() % 5; //第三种 int i = arc4random() % 5 ; 注: ① rand()和random()实际并不是一个真正的伪随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一样.       ② arc4random

浅谈iOS模糊效果

前言 今年过年微信客户端临时出现了一个非常有意思的功能,好友发出带了一层蒙层的照片,发指定金额的红包即可看到清晰相片,今天我们就解开这个神秘的技术面纱. 实现技术汇总 官方: CoreImage(很早就出现的技术,缺点是转化效率低) UIBlurEffect(iOS8以后出现的新技术,效率比上面的要好,并且简单) VImage 苹果提供了一个庞大的库,进行更复杂的模糊的效果实现 非官方: GPUImage(第三方大神写的框架) 让我们浅析一下上面的几种技术 1.CoreImage imageVi

iOS开发之浅谈MVVM的架构设计与团队协作

今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人了. 说道架构设计和团队

互联网产品市场:浅谈抄袭和适度创新

文章描述:互联网产品市场:浅谈抄袭和适度创新. 前几天参加敏捷大会,最大的收获乃是听到腾讯副总裁的这番回答,对这个问题有了重新的认识(或者说重新陷入迷惑,也行). 腾讯一直以来被认为是抄袭专家,创业杀手,甚至有"gouridetengxun"说法,马化腾自己也有"喜欢慢人半步"的言论,所以似乎一切都已经有定论. 那天底下一位观众问及此问题,吴军的回答如下(很精彩,凭记忆,有出入,请原谅): view plain MP3是苹果发明的吗?不是:手机是苹果发明的吗?不是: