单元测试

在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块的最小单位来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。 – 维基百科

使用单元测试以后,我们就没必要为了测试某个小模块去编译我们的程序,然后去等待模拟器启动然后到你需要验证的模块去。如果项目很大,编译要等很长时间

####单元测试能节约我们的时间,提高开发效率,对于项目越大的效果越明显。

###XCTest XCode4.x时代Xcode集成的是OCUnit,到了XCode5.x时代就升级为了XCTest,并且到了XCode7时代还有了进行UI测试的能力。除了官方自带的,还有一些比较出名的第三方的测试框架,如:GHUnit,KiWi,OCMock,Specta等,当然本文不讨论这些第三方框架。怎么知道我们的项目有没有加上单元测试,用Xcode打开你的项目,看文件导航栏有没有类似下图的两个文件夹(TestDemo是工程名)

其实在我们新建工程的时候就可以为我们的工程选择是否带上单元测试,如下图:

如果你的项目没有上面说的两个文件,你可以通过新建一个Target的方式添加,如下图: 就是给项目添加测试TARGETS

方法1

方法2

在这2个文件夹目录下分别都有2个文件,一个.m文件和一个plist文件。并且.m文件有4个方法,如下:

测试文件名称自定义,可以删除自己创建,注意要继承自XCTestCase 通过Xcode的File->New->File->Source选择Unit Test Case Class来新建一个UserTests,注意要继承XCTestCase类。

项目名+Test的.m文件里面默认有4个方法,这个文件里面主要做一些逻辑的测试。项目名+UITest的.m文件里默认有3个方法。这个文件里面主要做一些UI的测试。

在讲解如何写测试方法前,先说说默认的方法的作用

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3

// MZToolsTest.m #import <XCTest/XCTest.h> @interface MZToolsTest : XCTestCase @end @implementation MZToolsTest //每个test方法执行前调用,在这个测试用例里进行一些通用的初始化工作 - (void)setUp { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. } //每个test方法执行后调用 - (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

测试用例方法非常简单,从testExample这个方法我们大概知道怎么写了,方法名只需要以test开头,是的,就是这么简单。 现在我们模拟登录这个功能来写一个登录模块的测试用例

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (nonatomic, copy) NSString *userName;
@property (nonatomic, copy) NSString *passWord;

/**
 *  判断字符串中是否有中文
 */
- (BOOL)isChinese:(NSString *)string;

@end

现在我们通过Xcode的File->New->File->Source选择Unit Test Case Class来新建一个UserTests,注意要继承XCTestCase类。

接下来我们为User类写一个测试isChinese方法的测试方法,叫做testIsChinese,测试用例具体如下:

这样,你只要点击测试方法旁边的那个菱形的按钮就可以运行该测试方法!通过测试会变成绿色的对勾,失败会变成红色的叉叉。到这里测试用例你就会写了。也许你会在意那些断言,这样的断言有18个,如下

XCTFail(format…)  //生成一个失败的测试;
XCTAssertNil(a1, format...)  //为空判断,a1为空时通过,反之不通过;
XCTAssertNotNil(a1, format…) //不为空判断,a1不为空时通过,反之不通过;
XCTAssert(expression, format...) //当expression求值为TRUE时通过;
XCTAssertTrue(expression, format...) //当expression求值为TRUE时通过;
XCTAssertFalse(expression, format...)  //当expression求值为False时通过;
XCTAssertEqualObjects(a1, a2, format...)  //判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过;
XCTAssertNotEqualObjects(a1, a2, format...)  //判断不等,[a1 isEqual:a2]值为False时通过;
XCTAssertEqual(a1, a2, format...)  //判断相等(当a1和a2是 C语言标量、结构体或联合体时使用,实际测试发现NSString也可以);
XCTAssertNotEqual(a1, a2, format...)  //判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);

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

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

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没有发生具体异常、具体异常名称的异常时通过测试,反之不通过

UI测试稍后更新…..

###总结 这只是苹果官方集成在Xcode中的简单框架,优点就是简单,缺点也是简单。当然它的用法也绝非如此,有很多还待开发。苹果官方也有一个Demo,地址点击这里

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • FMDB

    SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。iOS SDK 很早就支持了 SQLite,在使用时...

    用户2491699
  • 基础算法

    0.创建类 BinaryTreeNode 1.创建方法:传入根结点 2.判断根节点是否为空 3.判断左右结点是否同时为空 4.用self调用此方法,将根节点的左...

    用户2491699
  • Hello Hexo

    Welcome to Hexo! This is your very first post. Check documentation for more info...

    用户2491699
  • 异常

    其中Exception及其子类(不包括RuntimeException)是必须捕获的异常

    Howl
  • Everything配置问题导致敏感信息泄露复现

    Everything是一个私有的免费Windows桌面搜索引擎,可以在NTFS卷上快速地根据名称查找文件和目录。

    PaperPen
  • iOS应用签名(上)

    关于iOS应用签名我想一起探讨一下它的原理.首先我们需要了解一个东西,叫做数字签名

    iOSSir
  • JUnit5 快速指南

    静默虚空
  • COGS 862. 二进制数01串【dp+经典二分+字符串】

    862. 二进制数01串 ★   输入文件:kimbits.in   输出文件:kimbits.out 简单对比 时间限制:1 s   内存限制:128 MB...

    Angel_Kitty
  • Python 之异常处理

      在Python中不同的异常可以用不同的类型(Python中统一了类与类型,类型即使类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误。

    用户2398817
  • ApacheTomca远程执行代码(CVE-2019-0232)漏洞浅析和复现

    本文由Tide安全团队成员“爱上卿Ooo”首发于FreeBuf TideSec专栏:

    用户1631416

扫码关注云+社区

领取腾讯云代金券