一 :前言

此篇文章是我自己探索来的,查看了很多前人写的文章,也看了很多 demo,稍微对此有了一些了解,所以就在此记录一下,此中肯定会有很多不足,请诸位精通单元测试的大佬给予支出,非常感谢

环境

Xcode 13.1

二:简介

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如 C 语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

三: 为什么需要使用 单元测试

1.0 设想你在在一个庞大的工程里面加个了 小功能 A ,按照我们前面的说法,是不是每次都要把工程跑起来,然后 去到 A 处 然后进行测试。甚至如果我们仅仅是想 测试一个 接口 返回的参数 而这个接口又需要使用到现有工程中的很多参数 等 如果使用 单元测试的话 就不用每次去 把整个工程跑起来,只需要跑你测试的部分。

2.0 我们可以使用单元测试测 某个方法的耗时和性能,单次 和 多次运行的整体对比的。当然你可以在 方法执行前 获取时间 ,方法结束 后获取时间等方式 获取时间消耗 姑且这样写 麻烦不说 但是如何 计算 CPU 占用这些消耗呢?当然我们可以使用 instrument 来做更专业的测试。 相对而言 单元测试更加便捷 和 方便使用给我们省不少事。

四:如何做单元测试

本文只介绍 Xcode 自带的 Unit Tests 和 UI Tests

4.1 在新建任何一个 工程时 很多小伙伴 对如下图 所示的 Include Tests (我记得之前是Include Unit Tests 和 Include UI Tests的,应该是 xcode 做了改动) 感到疑惑。

选择之后会,项目会生成 Tests he UITests 的文件夹以及里面的文件

当前,你也可以后续新建,或新增这种测试文件

五: 断言

说起 测试,就要先了解断言,下面列出一些常用的断言

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

六: Tests

6.1 测试方法

打开 Tests.m、或者 UITests.m 文件 ,如下图所示 鼠标光标选中菱形区域 就会 显示这个播放的状态,然后 点击 这个播放的状态 就会测试这个方法。 或者 选择左边 testDate右边也会出现 黑色的小播放按钮 点击也可以测试。
下面标注的有测试失败、成功的例子
注:自己写测试方法,要以 test 开头,无论 oc 还是 swift,否则不会出现菱形图标,没法进行测试

6.2 开始测试

6.2.1 测试自己写的方法

//测试 NSDate
- (void)testDate {NSDate * date = [NSDate new];NSString * nowTime = [date dateStringWithDateFormat:@"YYYY-MM-dd HH:mm:sszzz"];NSLog(@"当前时间:%@", nowTime);XCTAssertNotNil(nowTime, @"数据不能为空");
}
//设备信息
- (void)testDevice {  NSString * device_system_name = [HCDevice shared].device_system_name;NSLog(@"设备系统名称:%@", device_system_name);XCTAssertNotNil(device_system_name, @"设备系统名称不能为空");
}

6.2.2 测试网络请求

等待测试语句

//waitForExpectationsWithTimeout是等待时间,超过了就不再等待往下执行。
#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)testNetwork {NSDictionary * parameters = @{@"type": @"1",@"page": @"1",};NSString * url = @"https://apitwo.tupian.ltd/index.php/api/index/rankingList";[[HQJNetwork shared] request:POST setUrl:urlsetParameters:parameterssetFinish:^(HTTPResult type, id  _Nonnull response, NSString * _Nonnull message) {NSLog(@"%ld \n%@ \n%@", type, response, message);if (type == HTTPResultSuccess) {}NOTIFY}];WAIT
}

6.2.3测试弹窗

//测试  弹窗
- (void)testAlert {[HCAlertBottomView showMessage:@"message" setDelete:@"删除" setCancel:@"取消" completion:^(BOOL result) {NOTIFY //继续执行}];WAIT  //暂停   超出暂停时间会报错
}

这点我有点不理解,像弹窗不应该放到 UITests 里面测试吗?但是我放到 UITests 里面一直报错,希望有大佬看到给予解答,下面是放到 UITests 报错信息,同样的代码,我是从 Tests 里面完全复制来的

上面问题先忽略,因为并没有影响我做测试

七:UITests

这块是借鉴了iOS 单元测试(Unit Test 和 UI Test),感谢大佬的文章和 demo
关于这块的疑问: 像 app.buttons[@“登录”], app.textFields[@“请输入密码”],如果代码中有多个,他怎么识别呢? 下面是我的解决方式,也不知道对不对,期待大佬的解答
我这边做的处理,做那块的 UI 测试,代码在模拟器上运行之后(保持最新代码),关闭,重新再模拟器上打开,点击进入到该页面,然后运行测试,会自动进行填充数据,点击按钮

此处突然出现问题,进入到该页面启动不了,运行测试代码还是 app重新运行,除非测试内容在启动的第一个页面才能进行测试,求大佬给予技术支持!(如果在APP启动第一个页面,下面方法没有问题,问题解决中。。。未完待续 )

关于 UITest 有更加详细的介绍文字:UI Tests 自动化测试

7.1 测试方法

7.1.1 取得该页面下面所有的 button

但取到 还不能直接用,这个时候我们取到具体某个元素才行

    XCUIApplication *app = [[XCUIApplication alloc] init];app.buttons

7.1.2 取得该页面下面所有的 TextField

但取到 还不能直接用,这个时候我们取到具体某个元素才行

    XCUIApplication *app = [[XCUIApplication alloc] init];app.textFields

7.1.3 exists 元素是否存在

但取到 还不能直接用,这个时候我们取到具体某个元素才行

    XCUIApplication *app = [[XCUIApplication alloc] init];XCUIElement * button = app.buttons[@"12"];if ([button exists] == NO) {NSLog(@"该原先不存在");}

7.1.4 tap 元素点击(单击)

但取到 还不能直接用,这个时候我们取到具体某个元素才行

    XCUIApplication *app = [[XCUIApplication alloc] init];XCUIElement * button = app.buttons[@"12"];if ([button exists] == YES) {[button tap];}

7.2 模拟登录

如果secureTextEntry设置为 YES,textFields 会识别不到
self.textField.secureTextEntry = YES;

- (void)testlogin {XCUIApplication *app = [[XCUIApplication alloc] init];for (NSInteger i = 0;i < app.textFields.count; i++) {XCUIElement * textField = [app.textFields elementBoundByIndex:i];if ([textField exists]) {//判断是否存在NSString * placeholder =  [textField placeholderValue]; if ([placeholder isEqualToString:@"请输入手机账号"]) {[textField tap];[textField typeText:@"12345678910"];}if ([placeholder isEqualToString:@"请输入验证码"]) {[textField tap];[textField typeText:@"1234"];} if ([placeholder isEqualToString:@"请输入密码"]) {[textField tap];[textField typeText:@"66666"];}if ([placeholder isEqualToString:@"请再次输入密码"]) {[textField tap];[textField typeText:@"66666"];}}} XCUIElement * buttonLogin = app.buttons[@"登录"];if ([buttonLogin exists]) {[buttonLogin tap];}
}

此篇文章是做记录使用,刚刚开始搞这个东西,后续会继续补充,
各位大佬如果有建议,请给与提出,非常感谢

iOS 单元测试 Tests 和 UITests相关推荐

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

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

  2. 软件测试技术之iOS 单元测试—逻辑测试

    单元测试分为3种: 逻辑测试:测试逻辑方法 异步测试:测试耗时方法(用来测试包含多线程的方法) 性能测试:测试某一方法运行所消耗的时间 本节介绍逻辑测试,直接创建一个项目,并选中Include Uni ...

  3. 初探iOS单元测试XCTest

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

  4. iOS单元测试与集成

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

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

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

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

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

  7. iOS Automated Tests with UIAutomation

    Quick introduction Automated tests are very useful to test your app "while you sleep". It ...

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

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

  9. iOS 单元测试- 入门学习2

    前言 维基百科对单元测试的定义如下: 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可 ...

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

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

最新文章

  1. 人工智能名人堂第54期 | 深度学习鼻祖:Geoffrey Hinton
  2. 滑模控制中消除抖振的本质
  3. linux下,在挂载设备之前,查看设备的文件系统类型
  4. SpringBoot文档翻译系列——26.日志logging
  5. 网站建设过程中的:重要页面、关键页面、过程页面、结果页面
  6. eurekaAutoServiceRegistration 异常
  7. 中值滤波原理及c语言的实现,关于中值滤波算法,以及C语言实现(转)
  8. APP内嵌h5页面如何分享到微信?
  9. 利用Dreamweaver模板批量制作网页
  10. 虚拟仿真实训教学管理及资源共享平台虚拟实训开发对接文档
  11. 远程调试监视器 已在计算机上关闭,错误:“Microsoft Visual Studio 远程调试监视器”(MSVSMON.EXE) 似乎没有在远程计算机上运行。...
  12. 贝叶斯模型构建分类器的设计与实现
  13. 贝叶斯在计算机视觉中的应用,KNN与朴素贝叶斯在计算机视觉的鱼苗计数中的应用探索.doc...
  14. anbox 使用情况_Anbox是什么
  15. matlab累加数组的前n行,有一组m行n列的数组,在matlab中如何编程,每三个数求一次平均数(行与列分别求)?...
  16. 手动安装Python库或安装第三方库的方法
  17. 999句常用口语(1/2)
  18. RobotFramework自动化测试各类库关键字整理
  19. adb connect 远程adb连接手机无法连接,显示由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。(10060)windows调试Linux解决方式 ip连接方式
  20. 收藏几个高清图片和动图搜索制作的网站

热门文章

  1. 富盛企业经营分析软件操作手册下载
  2. 团队管理系列-任务分配
  3. 服务器信号满格网速很慢,网速变得很慢(wifi信号满格但网速慢)
  4. oracle 查询表最大值,ORA-1653报错 调整oracle数据表的最大值
  5. Database—DML
  6. 2021年11月 | openGauss走进高校活动系列回顾
  7. 一键设置 DeviceAdmin/ProfileOwner/DeviceOwner 应用
  8. 跨境erp系统功能分析
  9. java 定时关机_win7电脑怎么设置定时关机_win7电脑设置定时关机的详细教程-win7之家...
  10. 服务(Service)