使用背景

1.为了更快、更高效的开发, 开发过程中经常要写一些测试用例。 2.在开发过程中,有些很深的界面,需要满足很多条件、造很多假数据才可以进入的,但是前面那些界面我们根本就没有涉及修改,只是想进入最后这个界面;比如:订单支付完成界面。 这时候我们可以写测试用例,直接让其进入到想要进入的界面。

测试用例分为:单元测试和UI测试。 Xcode自带了测试用例文件。一般大的项目以及优秀的开源库都有测试用例的,比如:AFNetworking。 不会写的可以到这下载AFNetworking源码参考。

创建测试用例

1.新建工程文件,勾选测试用例

如果忘记勾选了, 也可以通过新建来创建。 和新建文件一样。

2.新建完的工程 测试用例和其他工程文件,分别属于不同的target。

3.测试用例文件 新的的测试用例文件,都是这个结构和基本的四个方法。

#import <XCTest/XCTest.h>@interface XcodeTestsTests : XCTestCase@end@implementation XcodeTestsTests/*!*  @brief 初始化方法。*  初始化、代码复用、准备测试条件*/
- (void)setUp {[super setUp];// Put setup code here. This method is called before the invocation of each test method in the class.
}
/*!*  @brief 销毁方法*  每次测试用例跑完,都会跑这个方法,释放对象、回收资源、避免干扰*/
- (void)tearDown {// Put teardown code here. This method is called after the invocation of each test method in the class.[super tearDown];
}
/*!*  @brief 测试用例方法*  注意: 这里方法必须以test开头,不然识别不了。*  开始测试用例方法,cmd+u  或者直接点击右侧这个小框箭头即可*/
- (void)testExample {// This is an example of a functional test case.// Use XCTAssert and related functions to verify your tests produce the correct results.
}/*!*  @brief 性能测试方法*  可以测试某一段方法的性能、耗时情况*/
- (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方法里完成。

注意:问题点

写了一个最简单的测试用例,运行不起来, 运行报错:-[UIApplication applicationState] must be used from main thread only。控制台报错信息:Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]

解决办法: 打开Xcode的Edit Scheme, 找到Test选项,去掉Runtime Api 检测选项即可。

以上正常情况下就可以运行了。 下面我们开始写一个简答的测试用例。

写测试用例

测试用例的过程一般分三步,这里以测试ViewController的一个加方法为例:

  1. 在VC里暴露接口:
/*!*  @brief 暴露接口*  暴露接口这里很重要,很有技术含量。*  尽可能的暴露少的信息来完成测试用例*/
- (NSInteger)addFunction:(NSInteger)a andB:(NSInteger)b;
复制代码

然后实现方法:

- (NSInteger)addFunction:(NSInteger)a andB:(NSInteger)b {return a + b;
}复制代码

2.在测试用例里导入头文件#import "ViewController.h" 以及初始化对象,准备测试条件。

3.开始测试方法

- (void)testAddFunction {// This is an example of a functional test case.// Use XCTAssert and related functions to verify your tests produce the correct results.//1.创建测试条件NSInteger a = 1, b = 2;//2.进行测试,直接调用测试方法NSInteger sam = [self.VC addFunction:a andB:b];//3.断言。断言方法有N多种,详细见下面。  测试最核心。XCTAssertEqual(sam, 3);  //前面这个是测试条件,后面的值是我们期望的值。 如果是正确的就测试通过,否则直接挂掉。}
复制代码

断言一览表:

 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语言标量、结构体或联合体时使用, 判断的是变量的地址,如果地址相同则返回TRUE,否则返回NO);
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没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
复制代码

异步测试

举一个最简答的例子:进入到具体界面里的的方法:

    //这里就直接定义一个字符串,假如出现异常,就直接抛出这个字符串XCTestExpectation *ex = [self expectationWithDescription:@"这里应该得进到订单完成界面"];OrderPayDoneViewController *controller = [[OrderPayDoneViewController alloc] initWithNibName:nilbundle:nil];//这里就是订单完成界面需要的属性,可以随便造假数据controller.orderId = @"这是订单 ID";controller.isPaidSuccess = YES;controller.orderAmount = @"23456";controller.payMethod = @"Paypal";controller.displayAmount = @"$11.8.0";[CurrentViewController().navigationController pushViewController:controlleranimated:YES];
//下面这两个方法就是XCTestExpectation的API[ex fulfill];  //这个方法不懂, 不写也可以调用[self waitForExpectations:@[ex] timeout:1000000];//这个不调用不能跳转
复制代码

单元测试

单元测试内容很多,还需要更多的研究,测试也很重要,对于开发对于测试都很重要,多多学习下单元测试吧。

后续

UI测试,可以自动进行测试。最基本的注册登录流程等常规,可以跑UI测试。。 内容比较多, 后续继续研究补充。

Xcode 自带单元测试相关推荐

  1. (0062)iOS开发之Xcode自带单元测试UnitTest

    转载:http://www.jianshu.com/p/009844a0b9ed 什么是单元测试? 一听到单元测试这个词感觉很高端,其实单元测试就是为你的方法多专门写一个测试函数.以保证你的方法在不停 ...

  2. Xcode自带的超好用的诊断工具

    欢迎关注我们的公众号,我们每周都会有原创文章分享.我们主要定位在移动开发领域,分享移动开发技术,包括 iOS.Android.小程序.移动前端.React Native.weex 等. 知识小集 Gi ...

  3. XCode中的单元测试:编写测试类和方法(内容意译自苹果官方文档)

    当你在工程中通过测试导航栏添加了一个测试target之后, xcode会在测试导航栏中显示该target所属的测试类和方法. 这一章演示了怎么创建测试类,以及如何编写测试方法. 测试targets, ...

  4. Xcode自带的instrument中的Automation实现自动化测试简单使用

    2019独角兽企业重金招聘Python工程师标准>>> 前言 当时研究iOS自动化测试工具的时候,找到了苹果自带的测试工具Automation,为了研究它,从网上找了资料,不过都是老 ...

  5. Xcode自带工具symbolicatecrash解析Crash文件

    项目中遇到一台手机运行测试包闪退的现象,而且是一个设备闪退其他设备没有再现的情况 可以看到Crash信息,但是指定的问题给出的是16进制内存地址,根本无法定位问题发生在哪个类的哪个函数中 所以需要解析 ...

  6. xcode 自带的git工具创建项目流程

    2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/2601834/blog/617894

  7. iOS开发——单元测试

    单元测试 闻名不如见面!在某技术交流群里问了下iOS开发的人,貌似写单元测试的程序猿不多,查了些资料写了demo,发现单元测试还是挺有用的,第一次用就确实测试出了运行成功语法没错,但是存在问题的方法! ...

  8. 如何在单元测试中测试异步函数,block回调这种

    大概有四种方法: runloop 阻塞主进程等待结果 semphaore 阻塞主进程等待结果 使用XCTestExpectation 阻塞主线程等待(我用这个,xcode自带的,为啥不用) 使用第三方 ...

  9. ios 单元测试覆盖率怎么查看_iOS 覆盖率检测原理与增量代码测试覆盖率工具实现...

    背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久.如果在开发.测试阶段能够提前暴露问题,就有助于避免线上事故的发生.代码覆盖率检测正是帮助开发.测试同学提前发现 ...

最新文章

  1. excplise tomcat启动过程中类找不到
  2. Ubuntu 之 atom 安装以及 常用配置
  3. 基于jsp的网上商城_[源码和文档分享]基于S2SH框架的JSP和MySQL的网上商城系统
  4. Spring Boot 应用监控:Actuator与 Admin
  5. 20万用户同时访问一个热点Key,如何优化缓存架构?
  6. Applications Manager Docker监控
  7. Android App 优化之 ANR 详解
  8. 架构设计工作笔记003---中台概念_业务中台_数据中台_技术中台
  9. android java 图形_java – 在Android中呈现的图像上的锯齿状边缘
  10. centos7学习笔记-安装配置apache
  11. com.mysql.jdbc.connection和java.sql.connection的区别
  12. 10.TCP/IP 详解卷1 --- 动态选路协议
  13. 区块链学习路线图 初阶+中阶+高阶
  14. 将bilibili缓存的m4s音视频文件合并(基于ffmpeg/含xml弹幕转ass/附exe程序)
  15. tk域名管理后台_Freenom免费域名.TK、.CF、.ML、.GA注册及使用方法
  16. LTE学习笔记之接口协议
  17. springMVC和mybatis的框架搭建
  18. promise的前世来生
  19. 基于运放的电压放大电路设计
  20. 磁珠与电感有什么区别?高频时磁珠怎么滤波?

热门文章

  1. NSObject协议中方法:description 和 debugDescription
  2. php进程SIGBUS,SIGSEGV错误
  3. DSPack的Demo中,那个VMR目录是什么意思?
  4. 严重红色警告-虾子+维C=砒霜
  5. [小改进]在个人Blog页面显示文章阅读数
  6. 关于禁止程序重复启动的另一种需要与实现《转》
  7. 《机器学习实战》-线性回归
  8. ElasticSearch踩坑记录
  9. Python3.x:pip命令安装第三方库,超时处理方案
  10. C#远程调用技术WebService葵花宝典