Swift单元测试Quick+Nimble
文章目录
- 使用Quick+Nimble
- 1、苹果官方测试框架XCTest的优缺点
- 2、选择Quick+Nimble的原因:
- 3、Quick+Nimble使用介绍
- 集成:
- Quick关键字说明:
- Nimble中的匹配函数
- 等值判断:使用equal函数
- 是否是同一个对象:使用beIdenticalTo函数
- 比较:
- 比较浮点数
- 类型检查
- 是否为真
- 是否有异常
- 集合关系
- 字符串
- 检查集合中的所有元素是否符合条件
- 检查集合个数
- 匹配任意一种检查
- 4、Quick使用总结
使用Quick+Nimble
github地址
1、苹果官方测试框架XCTest的优缺点
优点:与 Xcode 深度集成,有专门的Test 导航栏。
缺点:
1)因为受限于官方测试API,因此功能不是很丰富。
2)在书写性和可读性上都不太好。在测试用例太多的时候,由于各个测试方法是割裂的,想在某个很长的测试文件中找到特定的某个测试并搞明白这个测试是在做什么并不是很容易的事情。
3)所有的测试都是由断言完成的,而很多时候断言的意义并不是特别的明确,对于项目交付或者新的开发人员加入时,往往要花上很大成本来进行理解或者转换。另外,每一个测试的描述都被写在断言之后,夹杂在代码之中,难以寻找。
4)使用XCTest测试另外一个问题是难以进行mock或者stub
2、选择Quick+Nimble的原因:
主要是由于苹果官方框架的测试方法及断言不明确,可读性不好,难以分辨,交接项目需要花费的时间很多,所以建议采用三方测试框架
目前主流的三方测试框架主要有:
oc中:kiwi 、specta、cedar
swift:quick+nimble、Sleipnir
由于项目是使用的swift语言,所以主要采用quick+nimble,用于单元测试和断言。
如果你的项目是OC的,推荐使用kiwi,目前是start最多的三方框架。
3、Quick+Nimble使用介绍
Quick 是一个建立在XCTest 上,为Swift 和Objective-C 设计的测试框架. 对测试使用Swift编写的App非常友好,对Swift使用者来说,Quick是最佳选择
它通过DSL 去编写非常类似于RSpec 的测试用例。
Nimble 就像是Quick 的搭档,它提供了匹配器作为断言,用于编写匹配模式。
集成:
使用pod集成方便快捷:
pod ‘Quick’
pod ‘Nimble’
新建一个测试类,继承于QuickSpec父类,然后重写spec( )方法
示例代码:
finalfinal class BindDeviceTests: QuickSpec {override func spec() {//所有测试放在这里describe("test BindDeviceDB") {let findMac = "34:94:54:C2:E3:C6"let bindedMacs = ["34:94:54:C2:E3:C6","D8:0B:CB:62:08:5F","FF:F2:00:08:21:9C"]it("test saveBindDevice") {let bindDevice = BindDevice()bindDevice.scaleName = "test"bindDevice.userId = testLoginUserIdbindDevice.mac = testMacexpect(bindDevice.save()).to(beTrue())}it("test findBindDeviceList") {let list = BindDevice.findBindDeviceList()printLog(message: "test findBindDeviceWithMac: \(String(describing: list?.count))")expect(list?.count) == 6}......xit("test findNotUploadBindDevices") {let list = BindDevice.findNotUploadBindDevices()printLog(message: "test findNotUploadBindDevices: \(String(describing: list?.count))")expect(list).to(beNil())}}}}
Quick关键字说明:

Nimble中的匹配函数
等值判断:使用equal函数
- expect(actual).to(equal(expected))
- expect(actual) == expected
- expect(actual) != expected
是否是同一个对象:使用beIdenticalTo函数
- expect(actual).to(beIdenticalTo(expected))
- expect(actual) === expected
- expect(actual) !== expected
比较:
- expect(actual).to(beLessThan(expected))
- expect(actual) < expected
- expect(actual).to(beLessThanOrEqualTo(expected))
- expect(actual) <= expected
- expect(actual).to(beGreaterThan(expected))
- expect(actual) > expected
- expect(actual).to(beGreaterThanOrEqualTo(expected))
- expect(actual) >= expected
比较浮点数
- expect(10.01).to(beCloseTo(10, within: 0.1))
类型检查
- expect(instance).to(beAnInstanceOf(aClass))
- expect(instance).to(beAKindOf(aClass))
是否为真
- expect(actual).to(beTruthy())
- expect(actual).to(beTrue())
- expect(actual).to(beFalsy())
- expect(actual).to(beFalse())
- expect(actual).to(beNil())
是否有异常
- // Passes if actual, when evaluated, raises an exception:
- expect(actual).to(raiseException())
- // Passes if actual raises an exception with the given name:
- expect(actual).to(raiseException(named: name))
- // Passes if actual raises an exception with the given name and reason:
- expect(actual).to(raiseException(named: name, reason: reason))
- // Passes if actual raises an exception and it passes expectations in the block
- // (in this case, if name begins with ‘a r’)
- expect { exception.raise() }.to(raiseException { (exception: NSException) in
- expect(exception.name).to(beginWith(“a r”))
- })
集合关系
- // Passes if all of the expected values are members of actual:
- expect(actual).to(contain(expected…))
- expect([“whale”, “dolphin”, “starfish”]).to(contain(“dolphin”, “starfish”))
- // Passes if actual is an empty collection (it contains no elements):
- expect(actual).to(beEmpty())
字符串
- // Passes if actual contains substring expected:
- expect(actual).to(contain(expected))
- // Passes if actual begins with substring:
- expect(actual).to(beginWith(expected))
- // Passes if actual ends with substring:
- expect(actual).to(endWith(expected))
- // Passes if actual is an empty string, “”:
- expect(actual).to(beEmpty())
- // Passes if actual matches the regular expression defined in expected:
- expect(actual).to(match(expected))
检查集合中的所有元素是否符合条件
- // with a custom function:
- expect([1,2,3,4]).to(allPass({$0 < 5}))
- // with another matcher:
- expect([1,2,3,4]).to(allPass(beLessThan(5)))
检查集合个数
- expect(actual).to(haveCount(expected))
匹配任意一种检查
- // passes if actual is either less than 10 or greater than 20
- expect(actual).to(satisfyAnyOf(beLessThan(10), beGreaterThan(20)))
- // can include any number of matchers – the following will pass
- expect(6).to(satisfyAnyOf(equal(2), equal(3), equal(4), equal(5), equal(6), equal(7)))
- // in Swift you also have the option to use the || operator to achieve a similar function
- expect(82).to(beLessThan(50) || beGreaterThan(80))
4、Quick使用总结
- 使用Quick,编写it方法执行多个test方法,实际执行顺序,按照字母排序执行,可以从控制台打印得出
- 单元测试的方法,保存、删除、修改等会对数据库真正意义上的修改
- 使用xit,表示不测试这些方法
- 当既有it又有fit,表示只会测试fit的方法( 只要存在f开头的方法,单元测试开始执行便只会执行f开头的方法,即使不在同一个测试类中)
- 当使用describe、context、it嵌套使用时,当最外层方法使用了x开头的,整个入口都不会进入测试,即使嵌套里面使用了f开头的
相关文章:
Swift单元测试Quick+Nimble
文章目录 使用QuickNimble1、苹果官方测试框架XCTest的优缺点2、选择QuickNimble的原因:3、QuickNimble使用介绍集成:Quick关键字说明:Nimble中的匹配函数等值判断:使用equal函数是否是同一个对象:使用beIdenticalTo函…...
详解电源动态响应的测试方法及重要性 -纳米软件
电源动态响应测试的重要性 电源动态响应测试是为了检测电源系统在负载变化、输入电压变化情况下的性能表现,包括响应速度、稳定性以及恢复能力等,从而判断电源能否快速、准确地恢复到正常工作状态,为电源的优化设计提供依据。 动态响应能力影…...
计算机网络系统结构-2020期末考试解析
【前言】 不知道为什么计算机网络一门课这么多兄弟,这份看着也像我们的学科,所以也做了。 一. 单选题(每题 2 分,共 20 题,合计 40 分) 1 、当数据由主机 A 发送到主机 B ,不参…...
二叉树的遍历 Java
二叉树的遍历 递归法前序遍历中序遍历后序遍历改进 迭代法前序、后序遍历中序遍历 Java 中 null、NULL、nullptr 区别 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, Tree…...
数据结构之str类
str类 str 是字符串类。str 大概是 Python 中除了int 之外最基本、最常用的数据类型,在Java与其他语言里基本叫做String,其用途广泛,随处可见,但是要记住一点,字符串是不允许修改的。不过,我们仍然可以对其…...
Java电影购票小程序在线选座订票电影
Java电影购票小程序 功能:注册用户可已查看电影场次评价选座订票退票,影院管理员可以排片退款在线卖票和管理演播室等。超级管理员可管理电影排片电影院用户管理等。 演示视频 小程序: https://www.bilibili.com/video/BV11W4y1A7mK/?shar…...
24-1-9 bilibilic++音视频
下午两点面试,面试官迟到了一会,面试官人很好,整体面试经历很不错,但是我人太紧张了,基础知识掌握的深度不够,没有深挖, 是做音视频的底层相关的, 实习要求只要每天打卡够九个小时就…...
备案(三)
首次备案需要多少天 备案初审:您提交初审后,天翼云会在一个工作日内进行审核,并通过短信和邮件形式通知审核结果。 管局审核:各地通管局审核时间不同,一般为1到20个工作日,审核结果将以短信和邮件形式通知…...
Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化
第十九章-ClassLoaderData初始化 讲解本章先从一张图开始 众所周知,Java类的相关信息都是存储在元空间中的,但是是怎么存储的,相信很多读者是不清楚的,这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData&…...
impala元数据自动刷新
一.操作步骤 进入CM界面 > Hive > 配置 > 搜索 启用数据库中的存储通知(英文界面搜索:Enable Stored Notifications in Database),并且勾选,注意一定要勾选,配置后面的配置不生效。数据库通知的保留时间默认为2天&#…...
骑砍战团MOD开发(35)-射击精度系统
一.射击精度 和CF等FPS射击类游戏一样,为了模拟实际射击过程中弓箭,子弹等投掷物的射击偏移,故设计精度系统控制不同武器不同兵种的使用武器能力,统称为游戏精度系统. 由于骑砍可以在马上进行射击,故引擎内部也内置了骑射技能点以便控制玩家在骑马过程中射击的能力. 武器精度:通…...
树莓派非常实用的程序-3 vcdbg
vcdbg 是一个应用程序,用于帮助从在ARM上运行的Linux调试VideoCore GPU。它需要以根用户身份运行。此应用程序主要用于Raspberry Pi工程师,尽管有一些命令一般用户可能会发现有用。 sudo vcdbg help 将给出可用命令的列表。 NOTE 仅列出了最终用户使用…...
jmeter分布式服务搭建
目录 一、环境准备 二、 安装包下载 三 、安装jdk 四 、控制机安装 4.1 解压压缩包 4.2 修改 bin/jmeter.properties 4.3 修改 bin/system.properties 五、执行机安装 5.1 解压安装包 5.2 修改 bin/jmeter.properties 5.3 修改 bin/system.properties 5.4 启动执行机 …...
vue中el-radio无法默认选中
页面上不生效,默认什么都不选中 <el-radio-group v-model"queryParams.videoUrlType"><el-radio :label"1">本地上传</el-radio><el-radio :label"2">外部链接</el-radio> </el-radio-group>da…...
分布式I/O应用于智慧停车场的方案介绍
客户案例背景 目前车位检测技术有磁电技术、超声波技术、红外线技术、图像识别车位技术。考虑到例如电磁干扰、信号干扰等的环境因素影响,通常会采用组合使用的方式进行,如采用不同的传感器、应用不同的协议等,以便提高车位检测的准确性和实时…...
node后端+vue前端实现接口请求时携带authorization验证
node后端vue前端实现接口请求时携带authorization验证 我们在写web项目时,后端写好接口,前端想要调用后端接口时,除了登录注册页面,所有的请求都需要携带authorization,这样是为了避免随意通过接口调取数据的现象发生…...
SourceTree管理git
SourceTree管理git...
【数模百科】一篇文章讲清楚灰色预测模型GM(1,1)附python代码
本篇文章摘录自GM(1,1) - 数模百科 ,如果想了解更多有关灰色预测模型的信息,请移步 灰色预测模型 - 数模百科 首先,“灰色”这个词在这里不是指颜色,而是形容一种信息状态,介于黑(信息全无)和白…...
openssl3.2 - 官方demo学习 - mac - hmac-sha512.c
文章目录 openssl3.2 - 官方demo学习 - mac - hmac-sha512.c概述笔记END openssl3.2 - 官方demo学习 - mac - hmac-sha512.c 概述 MAC算法为HMAC, 设置参数(摘要算法为SHA3-512), 用key初始化, 对明文做MAC数据. 笔记 /*! \file hmac-sha512.c \note openssl3.2 - 官方demo…...
pycharm的使用技巧
1.新建文件时,自动生成代码 settings->editor->file and code templates,选择python script ${NAME} 文件名 ${DATE} 日期 2.自动补齐自定义段落 settings->editor->live templates,在右侧点击+号,添加自定义的内容 完成之后,在下方勾选python 3.修改注释的…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
