用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(一)

在这里插入图片描述

概述

从 WWDC 24 开始,苹果推出了全新的测试机制:Swift Testing。利用它我们可以大幅度简化之前“老态龙钟”的 XCTest 编码范式,并且使得单元测试更加灵动自由,更符合 Swift 语言的优雅品味。

在这里插入图片描述

在这里我们会和大家一起初涉并领略 Swift Testing 的测试之美。

在本篇博文中,您将学到如下内容:

  • 概述
  • 1. 何为 Swift Testing?它和之前的 XCTest 有何不同?
  • 2. 如何将 Swift Testing 集成到 Xcode 项目中?
  • 3. 御驾亲征:用鲜活的例子说话
  • 总结

测试为先,质量为王!无测试,不软件!

那还等什么呢?Let’s testing!!!😉


1. 何为 Swift Testing?它和之前的 XCTest 有何不同?

Swift 测试(Swift Testing)是今年 WWDC 24 中苹果为 Swift 撸码增加的一项重磅功能,它充分利用去年 WWDC 23 推出的宏(Macro)机制,并借助 Swift 语言的“天赋异禀”迅速成为苹果代码开发中的心膂股肱。

在过去,为了完成项目中的单元测试,我们需要借助 XCTest 测试“套件”的力量,可以看到它诞生于远古的 Xcode 7.2:

在这里插入图片描述

使用 XCTest 框架,我们可以这样写单元测试:

import XCTestfinal class ExampleXCTest: XCTestCase {// 构造操作override func setUpWithError() throws {}// 析构操作override func tearDownWithError() throws {}func testExample() throws {XCTAssertTrue(true, "该测试会永远通过!")}
}

从上面代码可以看到,我们需要继承 XCTestCase 类实现所需的测试方法集。其中需要设置好必要的测试构造和析构方法,并且所有的测试方法都必须以 “test” 开头。

使用“年代久远”的 XCTest 进行测试似乎有些繁文缛礼、连篇累牍,况且多如牛毛的 XCTAssertXXX 重载方法的选择也会让秃头码农们目不暇接。而使用 Swift Testing 我们可以大大简化 XCTest 的构造过程。

比如,下面是用 Swift Testing 重写的测试代码:

import Testing@Test func swiftTestingExample() {// 构造操作#expect(true, "该测试会永远通过!")// 析构操作
}

从新测试代码可以看到,它们与 XCTest 有以下几点不同:

  1. 不需要先创建派生自 XCTestCase 的测试类;
  2. 直接写测试逻辑,简单明了、一发入魂;
  3. 测试方法名无需限定于特定前缀,而是用 @Test 宏来修饰;

Swift Testing 除了能够简化测试逻辑以外,我们还可以利用它方便的测试“重复”的条件以及灵活的将多个情景相同的测试“聚合成组”。


更多 Swift Testing 的使用奥秘,请小伙伴们移步苹果官方站点观赏 WWDC 24 开发视频:

  • ▶️ Meet Swift Testing
  • ▶️ Go further with Swift Testing

2. 如何将 Swift Testing 集成到 Xcode 项目中?

使用 Swift Testing 进行单元测试主要有两种方式。

一种是在创建新项目时,就选择将它加入到 Testing System 中去:

在这里插入图片描述

否则,要想将 Swift Testing 加入已存在的 Xcode 项目里,我们不能只通过添加一个包含测试逻辑的 swift 文件来达到目的,那样做的话会让 Xcode “大声抱怨”找不到 Testing 框架

在这里插入图片描述

至少在 Xcode 16 中暂时无法这样做。我猜测是因为使用 Swift Testing 进行测试并不仅仅是单纯导入了 Testing 框架,Xcode 还需要修改项目的配置信息来深度集成测试环境。

作为替代,我们必须为项目新增一个 Unit Testing 编译目标(Target),并选择 Swift Testing 作为测试系统:

在这里插入图片描述

3. 御驾亲征:用鲜活的例子说话

为了能让小伙伴们更深刻的领悟到 Swift Testing 的“魅力”,拒绝冷冰冰的说教,我们决定写一个实际的“栗子”来“融会贯通”。

首先,创建一个 Xcode 项目并按照之前的方法加入 Swift Testing 测试系统。

接着,我们新建数据模型:

import Foundationfileprivate let fakeNames = ["黄飞鸿", "齐天大圣", "黑神话悟空"]struct Item {let name: Stringlet age: Intlet power: Doublelet isImmortal: Boolstatic func createTestItems() -> [Item] {fakeNames.map {Item(name: $0,age: Int.random(in: 1...100),power: Double.random(in: 5...1000),isImmortal: Bool.random())}}
}struct Model {static var shared = Model()private(set) var items = [Item]()mutatingfunc createItems() {items = Item.createTestItems()}mutatingfunc deleteAllItems() {items.removeAll()}
}

在上面的代码中我们创建了 Item 类型,并将其包裹到 Model 数据模型中以备后续使用。

随后,我们编写测试逻辑:

import Testing
@testable import SwiftTestDEMO@Test("测试创建 Itmes")
func createItems() {var model = Model.sharedmodel.createItems()#expect(!model.items.isEmpty, "应该成功创建若干 Items!")
}

在上面的代码中,我们使用 createItems 方法验证了创建 Item 是否真正成功。可以看到:我们的 createItems 方法“一枝独秀”,摆脱了所有不必要的桎梏,显得那么无拘无束。

按住 Command(⌘)+ U 快捷键,我们第一个测试必须顺利通过:

在这里插入图片描述

在后面的博文中,我们将继续介绍 Switch Testing 中一些重要宏的应用场景,敬请期待吧!


想要系统学习 Swift 的小伙伴们,请来我的《Swift语言开发精讲》专栏逛一逛哦:

在这里插入图片描述

  • 《Swift 语言开发精讲》

总结

在本篇博文中,我们介绍了 WWDC 24(Xcode 16)新引入的 Swift Testing 测试系统、比较了它和 XCTest 的区别、如何集成到 Xcode 项目中,并用一个鲜活的例子讨论了它的金辉玉洁。

感谢观赏,下篇再会啦!😎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457347.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.Linux按键驱动-创建字符设备,通过应用程序读取按键值

1.在上一个博客的基础上,添加一个字符设备 https://blog.csdn.net/weixin_40933496/article/details/143253515?spm1001.2014.3001.55012.在probe函数中注册字符设备 register_chrdev(包含对应的file_operations结构体) class_create device_create3.在中断处理函…

基于大模型的招聘智能体:从创意到MVP

正在考虑下一个 SaaS 创意?以下是我在短短几个小时内从创意到 MVP 的过程。 以下是我将在这篇文章中介绍的内容概述: 为什么这个想法让我产生共鸣我是如何开始构建它的我现在的处境以及我是否会真正推出 获得 SaaS 创意并构建它并不容易。就是这样。 …

opencv学习笔记(1):基础知识

1.像素: 像素:数字图像的最小单位。数字图像由像素组成,像素由一系列代码表示的原色组合而成。 2.颜色空间: 颜色空间:也称彩色模型(又称彩色空间或彩色系统)。 (说白了就是用来描述…

FCN深度学习语义分割开山之作——学习笔记

《Fully Convolutional Networks for Semantic Segmentation》提出了首个端到端的针对像素级预测的全卷积网络(FCN),可直接处理任意大小的输入图像并输出相应大小的预测结果,超过了现有技术水平。 一、提出背景 传统的语义分割方…

[计算机网络]第一周

TCP/IP 与OSI TCP/IP TCP/IP 四层模型是一个分层网络通信模型,它将网络通信过程分为四个层次,这四层分别是:网络接口层、互联网层、传输层和应用层。 网络接口层负责在计算机和网络硬件之间传输数据,负责在物理网络上发送和接收…

2024“源鲁杯“高校网络安全技能大赛-Misc-WP

Round 1 hide_png 题目给了一张图片,flag就在图片上,不过不太明显,写个python脚本处理一下 from PIL import Image ​ # 打开图像并转换为RGB模式 img Image.open("./attachments.png").convert("RGB") ​ # 获取图像…

241026-RHEL如何以root身份卸载Docker

在 RHEL 8.8 中,以 root 身份卸载 Docker 可以通过以下步骤完成: 停止 Docker 服务(如果已启动): sudo systemctl stop docker删除 Docker 包: 运行以下命令卸载 Docker 引擎及其依赖包(docker-…

Redis多级缓存

多级缓存 传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈Redis缓存失效时,会对数据…

在多数据中心环境中,自动化运维如何保证跨区域的一致性?网络延迟导致的数据不一致是否可以完全避免?|自动化运维|跨区域一致性

目录 1. 跨区域一致性的定义与重要性 1.1 跨区域一致性的定义 1.2 跨区域一致性的意义 2. 网络延迟的挑战 2.1 网络延迟的来源 2.2 网络延迟对一致性的影响 3. 自动化运维如何实现跨区域一致性 3.1 使用分布式数据库 3.2 采用同步与异步复制 3.3 引入一致性协议 3.4…

Uni-App-03

登录功能开发 实现POST提交 HTTP协议规定请求消息内容类型(Content-Type)有哪些?—— 只有四种 text/plain 没有编码的普通数据 application/x-www-form-urlencoded 编码后的普通数据 multipart/form-data 请求主体中包含文件上传域 application/json 请求主体是 J…

【云原生网关】Higress 从部署到使用详解

目录 二、网关概述 2.1 什么是云原生网关 2.2 常见的云原生网关 2.2.1 Nginx 2.2.2 ApiSix 2.2.3 Kong 2.2.4 Apache Shenyu 2.2.5 Higress 2.2.6 Envoy​​​​​​​ 三、higress介绍 3.1 什么是higress 3.2 Higress 定位 3.3 Higress 内核选择 四、Higress搭…

Vscode + EIDE +CortexDebug 调试Stm32(记录)

{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{"cwd": "${workspaceRoot…

阿里面试竟被“DPO微调”吊打...

最近已有不少大厂都在秋招宣讲,也有一些已在 Offer 发放阶段了。 节前,我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行…

一个可以调节笔记本亮度的程序

在我这台笔记本上,当我把显示模式调为读显时发现右下角的亮度不能调了,就像这样 听说时nvidia显卡不适配的问题 咱也不知道呀 于是我就用java写了程序来调节,用了俩个多月,没啥问题的 打开就是这样拉动直接就可以调节 源码 im…

unity中的组件(Component)

在 Unity 中,组件(Component)是构成 GameObject 功能和行为的基础单元,每个 GameObject都可以附加一个或多个组件,以实现不同的功能 1. Transform 组件 描述:所有 GameObject 默认都有一个 Transform 组件…

C++研发笔记8——C语言程序设计初阶学习笔记6

在第一部分——课前准备的学习中,我就提到了学习C语言的过程中,练习是必不可少的环节,所以本篇笔记我们来进行记录我们学习《C语言程序设计初阶》阶段的第一篇练习文章。 题目一 下面哪个不是C语言内置的数据类型: A.char B.d…

【大数据学习 | kafka】kafuka的基础架构

1. kafka是什么 Kafka是由LinkedIn开发的一个分布式的消息队列。它是一款开源的、轻量级的、分布式、可分区和具有复制备份的(Replicated)、基于ZooKeeper的协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比,KafKa能够很好…

C++基础:三个字符串也能搞大小?

上一篇说了三个整数比较大小,按照顺序输入的,这次我们看看字符串的,顺便把那个简化以下: 题目:这次输入三个字符串。如果用户输入“Stenbeck", “Hemingway”,“Fitzgerald”,输出将是“Fitzgerald,Hemingway&…

OPPO携手比亚迪共同探索手机与汽车互融新时代

10月23日,OPPO与比亚迪宣布签订战略合作协议,双方将共同推进手机与汽车的互融合作,这一合作也标志着两大行业巨头在技术创新和产业融合上迈出了重要一步,为手机与汽车的深度融合探索新的可能。 OPPO创始人兼首席执行官陈明永、OP…

LCD手机屏幕高精度贴合

LCD手机屏幕贴合,作为智能手机生产线上至关重要的一环,其质量直接关乎用户体验与产品竞争力。这一工艺不仅要求屏幕组件间的无缝对接,达到极致的视觉与触觉效果,还需确保在整个生产过程中,从材料准备到最终成品&#x…