测试基本流程

添加单元测试

  1. 创建项目时勾选Inclue Unit Tests .
  2. 忘了勾选可通过创建File–>new–>target–>iOS–>iOS Unit Testing Bundle。

默认单元测试文件

继承XCTestCase,默认的方法有4个:
1. setUp(每个测试方法调用前执行, 在执行完父类方法后添加自定义配置);
2. tearDown(每个测试方法调用后执行,在执行父类方法前添加自定义配置);
3. textExample(一个示例);
4. testPerformanceExample(在measureBlock中放入需要测试性能的代码)方法。

添加测试用例

测试用例命名必须以test开头,不可有参数且返回为void,不然无法识别为测试方法。测试用例类型有3种:普通测试,性能测试与异步测试。在后文中有详细介绍

运行单元测试

  1. 运行单元测试快捷键: CMD + U测试整个文件的测试用例
  2. 也可通过每个单元测试用例左边的按钮执行单元测试,执行后绿色勾选按钮代表测试成功,红色叉号按钮代表测试失败。

测试用例类型

普通测试

如果代码未返回预测结果,则通过断言API打印错误。

// 1. 普通测试
- (void)testExample {// This is an example of a functional test case.// Use XCTAssert and related functions to verify your tests produce the correct results.NSLog(@"testExample");int a = 0;XCTAssertTrue(a == 0, "断言a等于0,不等于则测试没通过");
}

常用断言如下所示(以下断言含义from ios UnitTest 学习笔记):

// 常用断言
XCTAssert(expression, format...)当expression求值为TRUE时通过;
XCTAssertTrue(expression, format...)当expression求值为TRUE时通过;
XCTAssertFalse(expression, format...)当expression求值为False时通过;XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过;
XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;
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发生异常时通过;反之不通过;(很变态)XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试;
XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
// 非常用断言
XCTFail(format…) 生成一个失败的测试;
XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;

ps:
?1. XCTAssert与XCTAssertTrue有什么区别

?2. XCTAssertEqualObjects和XCTAssertEqual有什么区别
[reply]XCTAssertEqualObjects(a1, a2, format…)的判断条件是[a1 isEqual:a2]是否返回一个YES。XCTAssertEqual(a1, a2, format…)的判断条件是a1 == a2是否返回一个YES,如果a1和a2都是基本数据类型变量,那么只有a1 == a2才会返回YES;如果a1和a2都是指针,那么只有a1和a2指向同一个对象才会返回YES。

性能测试

// 2. 性能测试
- (void)testPerformanceExample {// This is an example of a performance test case.[self measureBlock:^{// 运行测试后,该行会显示执行时间,block内放入需测试性能的代码块// Put the code you want to measure the time of here.for (int i = 0; i < 100; i++) {NSLog(@"dd");}}];
}

异步测试

定义一个或多个XCTestException(通过调用XCTestCase的expectationWithDescription:方法获取XCTestExpection), 异步代码执行完成调用XCTestException实例的fullfill方法通知异步测试满足条件。然后再通过调用类中的waitForExceptionsWithTimeout:handler方法设置异步测试超时时间,并通过handler设置超时行为。

// 3.异步测试
- (void)testRequest {XCTestExpectation *requestExpectation = [self expectationWithDescription:@"send request"];AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];[mgr GET:@"https://baidu.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {NSLog(@"responseObject:%@", responseObject);XCTAssertNotNil(responseObject, @"返回错误");[requestExpectation fulfill];} failure:^(AFHTTPRequestOperation *operation, NSError *error) {NSLog(@"error:%@", error);XCTAssertNil(error, @"请求出错");[requestExpectation fulfill];}];[self waitForExpectationsWithTimeout:3.0 handler:^(NSError * _Nullable error) {if (error) {NSLog(@"Timeout Error:%@", error.description);}}];
}

单元测试的意义

Luis Solano在Objc.io的一篇文章中《Bad Testing Practices 》总结了自动化测试的五个好处:
1. 使重构更为简单;
2. 避免代码恶化;
3. 提供可执行的说明和文档;
4. 减少创建软件的时间;
5. 减少创建软件的代价。
总的来说也可以通过Objc.io的另一篇文章《Real-World Testing with XCTest》中的一句话简述:
测试使我们的代码质量变的可靠,同时让我们重构或修改代码而不用担心修改是否破坏了其他部分。

参考资料

[官方文档–Writing Test Classes and Methods]
iOS 单元测试之XCTest详解(一)
ios UnitTest 学习笔记

初探iOS单元测试XCTest相关推荐

  1. iOS 读书笔记-单元测试XCTest

    测试驱动下的iOS开发.这两天看了一下关于这方面的基础知识.扫一下盲. 测试驱动开发,英文Test-Driven Development 简称TDD.他是一种新型的软件开发方法.他要求在写代码之前先编 ...

  2. iOS 单元测试和 UI 测试快速入门

    iOS 单元测试和 UI 测试快速入门 前言 平时写完业务代码的时候都会去自己测试一遍,后面每次有修改都需要重复测,不管是一个业务流程还是一个工具类,其实都可以通过测试框架来帮助我们完成测试,特别是一 ...

  3. iOS 单元测试和UI测试教程

    原文:iOS Unit Testing and UI Testing Tutorial 作者:Audrey Tam 译者:kmyhy 编写测试不是为了追求刺激,测试是为了避免你崭新的 App 变成了充 ...

  4. iOS单元测试和UI测试全面解析

    编写测试可不是一项迷人的工作;然而,由于测试可以避免使你的宝贝应用程序变成一块充斥错误的大垃圾场,所以编写测试又是一项非常有必要做的工作.如果你正在阅读本文,那么你应当已经知道你应该为您的代码和用户界 ...

  5. iOS单元测试与集成

    前言 随着测试在软件开发周期中越来越受到重视,BAT大部分开始取消了测试工程师职位,全部变成了测试开发职位.需要在有测试能力的基础上兼备开发能力:另一方面自动化测试成为趋势,利用开发的技巧解决测试中的 ...

  6. iOS单元测试:Specta + Expecta + OCMock + OHHTTPStubs + KIF

    框架选择 参考这篇选型文章,http://zixun.github.io/blog/2015/04/11/iosdan-yuan-ce-shi-xi-lie-dan-yuan-ce-shi-kuang ...

  7. IOS单元测试(—)

    单元测试 OCUnit(即XCTest测试) 这个就是苹果自己的测试框架 GHUnit 这是一个可视化的测试框架,可以点击app来决定测试哪个方法,并且可以点击查看测试结果等.(后续详细叙述) OCM ...

  8. iOS单元测试(作用及入门提升)

    由于只是一些简单实用的东西,学学还是挺不错的.其实单元测试用的好,开发起来也会快很多.单元测试对于我目前来说,就是为了方便测试一些功能是否正常运行,还有调试接口是否能正常使用.有时候你可能是为了测试某 ...

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

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

最新文章

  1. JavaServer Faces技术
  2. stm32使用 ST-LINK Utility量产,程序读保护、写保护
  3. 梁体混凝土弹性模量计算_预应力混凝土连续梁多点转向顶推施工技术研究
  4. centos 7挂载windows共享目录
  5. 阿里巴巴开源容器镜像加速技术
  6. Windows7 beta1 微软官方下载
  7. 开关电源磁性元件理论及设计pdf_2020年开关电源需求活跃 通讯运营商已多轮集采...
  8. exponential family distribution(指数族分布)
  9. 区块链应用如何实现资金盘分红
  10. Wifi密码破解(rtl8818linux驱动安装)
  11. HTML+CSS网页制作——恒德电子
  12. Win10激活彻底破解:一键获取数字权利工具问世
  13. 网页iframe框架常见的应用例子
  14. 青少年软件编程(Python)等级考试试卷一级(判断题)2021-9
  15. flex实现四个元素分布在盒子的四个角
  16. VLAN中SVL和IVL的区别
  17. Moblin v2开发环境设置——创建一个新应用程序
  18. Nat. Commun. | 可多层次预测多肽-蛋白质相互作用的深度学习框架
  19. 百度地图实现地图全屏(放大页面全屏)
  20. Java面试官:兄弟,你确定double精度比float低吗?

热门文章

  1. 数字图像处理MATLAB学习笔记(五)
  2. 线程同步之互斥量(互斥锁)
  3. 双链表(double_linked_list):(增、删、改、查、逆置)的C++的例子,稍微改一下,就成C。
  4. 财务知识入门——《富爸爸,穷爸爸》
  5. 虚拟化中的链接克隆技术
  6. 湖中剑 前端周刊 #13 | Web录屏、Bundleless、低代码 Deco、Bundle Scanner、RN 低功耗蓝牙
  7. libjpeg库的用法
  8. 如何选择合适的网络自动化工具
  9. 线性代数:线性方程求解、矩阵的逆、线性组合、线性独立
  10. win xp出现“安装程序包的语言不受支持”的解决