单元测试

  • OCUnit(即XCTest测试)

    • 这个就是苹果自己的测试框架
  • GHUnit
    • 这是一个可视化的测试框架,可以点击app来决定测试哪个方法,并且可以点击查看测试结果等。(后续详细叙述)
  • OCMock
    • 这个是模拟某个方法或者属性的返回值。(后续详细叙述)

创建一个简单的单元测试

  • 新建项目:
    最简单的单元测试
  • 一个简单的测试demo
    • 该类继承自XCTestCase类,其中包含三个方法:setUp,tearDown和testExample。setUp方法用于在测试前设置好要测试的方法,tearDown则是在测试后将设置好的要测试的方法拆卸掉。testExample是测试方法。测试方法必须以testxxx的格式,并且不能有参数和返回值,不然不会识别为测试方法。测试方法的执行顺序是字典排序。快捷键command+ u进行单元测试,这个快捷键是全部测试。当有多个测试方法时候不管顺序如何排列,测试方法执行的顺序与方法名中test后面的字符大小有关,小者优先,例如testA,testB1,testB2三个方法相继执行。在testExample方法中输入
 NSLog(@"自定义测试testExample");NSString *temp;int a=3;XCTAssertNil(temp,@"a为空");XCTAssertTrue(3==a,@"a等于3");

进行网络请求的测试

使用CocoaPods安装AFNetworking和STAlerView

# platform :ios, '9.0'target 'UnitTestDemo' do
pod 'AFNetworking', '~> 3.1.0'
pod 'STAlertView', '~> 1.0.0'

在Info.plist中添加NSAppTransportSecurity类型Dictionary。 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES。

IOS9的http安全问题:现在进行异步请求的网络测试,由于测试方法主线程执行完就会结束,所以需要设置一下否则没发查看异步返回的结果。

#define WAIT do {\
[self expectationForNotification:@"RSBaseTest" object:nil handler:nil];\
[self waitForExpectationsWithTimeout:30 handler:nil];\
} while (0);#define NOTIFY \
[[NSNotificationCenter defaultCenter]postNotificationName:@"RSBaseTest" object:nil];

测试方法

-(void)testRequest
{AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];// 返回的格式 JSONmanager.responseSerializer = [AFJSONResponseSerializer serializer];manager.requestSerializer = [AFHTTPRequestSerializer serializer];// 可接受的文本参数规格manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/plain", nil];manager.requestSerializer.timeoutInterval = 10;[manager GET:@"http://www.weather.com.cn/adat/sk/101110101.html" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"responseObject:%@",responseObject);XCTAssertNotNil(responseObject, @"返回出错");self.stAlertView = [[STAlertView alloc]initWithTitle:@"验证码" message:nil textFieldHint:@"请输入手机验证码" textFieldValue:nil cancelButtonTitle:@"取消" otherButtonTitle:@"确定" cancelButtonBlock:^{//点击取消返回后执行[self testAlertViewCancel];NOTIFY //继续执行} otherButtonBlock:^(NSString *b) {//点击确定后执行[self alertViewComfirm:b];NOTIFY //继续执行}];NOTIFY //继续执行} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"error:%@",error);XCTAssertNil(error, @"请求出错");// NOTIFY //继续执行}];WAIT //暂停
}-(void)testAlertViewCancel{NSLog(@"取消");
}
-(void)testAlertViewComfirm{[self alertViewComfirm:nil];
}
-(void)alertViewComfirm:(NSString *)test{NSLog(@"手机验证码:%@",test);
}

断言测试

下面一共18个断言(SDK中也是18个,其含义转自ios UnitTest 学习笔记,真心佩服原文的博主,部分宏小弟已经测试过):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没有发生具体异常、具体异常名称的异常时通过测试,反之不通过

特别注意下XCTAssertEqualObjects和XCTAssertEqual。
XCTAssertEqualObjects(a1, a2, format…)的判断条件是[a1 isEqual:a2]是否返回一个YES。

XCTAssertEqual(a1, a2, format…)的判断条件是a1 == a2是否返回一个YES。
对于后者,如果a1和a2都是基本数据类型变量,那么只有a1 == a2才会返回YES。例如下面代码中只有第二行可以通过测试:

// 比较基本数据类型变量
XCTAssertEqual(1, 2, @"a1 = a2 shoud be true"); // 无法通过测试
XCTAssertEqual(1, 1, @"a1 = a2 shoud be true"); // 通过测试

但是,如果a1和a2都是指针,那么只有a1和a2指向同一个对象才会返回YES。array1和array2指向不同对象,无法通过测试。.例如下面的代码中:

// 比较NSArray对象
NSArray *array1 = @[@1];
NSArray *array2 = @[@1];
NSArray *array3 = array1;
XCTAssertEqual(array1, array2, @"a1 and a2 should point to the same object"); // 无法通过测试
XCTAssertEqual(array1, array3, @"a1 and a2 should point to the same object"); // 通过测试

对于字符串就不同了,由于str1和str2指向同一常量,常量在内存的data段中地址是固定的,所以二者地址相同。

// 比较NSString对象
NSString *str1 = @"1";
NSString *str2 = @"1";
NSString *str3 = str1;
XCTAssertEqual(str1, str2, @"a1 and a2 should point to the same object"); // 通过测试
XCTAssertEqual(str1, str3, @"a1 and a2 should point to the same object"); // 通过测试

IOS单元测试(—)相关推荐

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

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

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

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

  3. 初探iOS单元测试XCTest

    测试基本流程 添加单元测试 创建项目时勾选Inclue Unit Tests . 忘了勾选可通过创建File–>new–>target–>iOS–>iOS Unit Testi ...

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

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

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

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

  6. iOS单元测试与集成

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

  7. ios 单元测试覆盖率怎么查看_使用 Xcode 检测代码覆盖率

    "代码覆盖率"是软件测试中的一种度量,用于描述工程中源代码被测试到的比例和程度. 在做单元测试时,代码覆盖率经常被拿来作为衡量测试质量好坏的指标,同时也能在一定程度上检测出工程中的 ...

  8. 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 ...

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

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

最新文章

  1. android studio ndk 书籍,NDK 在AndroidStudio3.2.1版本集成方法(ndk-build方式)
  2. 高亚芳 mysql_MySQL · 专家投稿 · MySQL数据库SYS CPU高的可能性分析
  3. 用计算机画关于科技的画,用计算机鉴识画作
  4. [OpenGL ES 03]3D变换:模型,视图,投影与Viewport
  5. 7.组件连线(贝塞尔曲线)--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)...
  6. android studio背景模糊_[Android翻译]CameraX:过去、现在和未来的一瞥
  7. Thinking In Java 读书笔记
  8. jeecg集成积木报表错误_6688种玩法的电子积木,是什么体验?「中外玩具网测评」...
  9. 95-080-048-源码-启动-启动standalonesession
  10. keil 在多字节的目标代码页中 没有此unicode_Go语言之父带你重新认识字符串、字节、rune和字符
  11. SpringCloud学习笔记025---SpringBoot_注释理解_@Qualifier 注释
  12. 30个要点帮你完成java代码优化
  13. Hbase Scan类 ResultScanner类
  14. matlab 颜色代码 大全_空客 | 红、绿、蓝、白,各类颜色代码的含义
  15. Android 动画录制 GIF录制
  16. 云编程和软件环境 、物联网的关键技术
  17. win10动态壁纸无法通过右击属性的个性化来换掉
  18. Linux系统如何优化
  19. SQL SERVER | 错误处理 INSERT 语句与 FOREIGN KEY SAME TABLE 约束“FK__Course__Cpno__276EDEB3“冲突。(补充)
  20. 石墨笔记,Onenote,Effie哪个更适合评论家?

热门文章

  1. 高通平台msm8917 闪光灯解析
  2. 【Web技术】624- redux、mobx、concent 状态管理方案对比
  3. c语言酶切算法,科学网—FitHiC V1算法解析(一) - 卢锐的博文
  4. 实现APP支付QQ,微信,支付宝三方的后端服务------php实现QQAPP支付
  5. Trie树的构建和应用
  6. 首信进军电子商务领域
  7. python3ide_推荐:3款开源的Python IDE
  8. 上云本身其实没啥意义 如无必要建议不要上云
  9. vue中级联选择器回填_浅谈Vue使用Cascader级联选择器数据回显中的坑
  10. 如何在组织中培养人才:5个关键步骤