WWDC24(Xcode 16)中全新的 Swift Testing 使用进阶

在这里插入图片描述

概述

WWDC 24 祭出的全新单元测试系统着实让苹果开发者们眼前一亮。“原来测试还可以这么爽!?”,日渐逼近蟋蟀发型的某位码农如是说。

在这里插入图片描述

Swift Testing 在简洁性以及灵活性全面超越老大哥 XCTest 的同时,也让秃头码农们真正见识到了 Swifty 范儿测试的灵魂。

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

  • 概述
  • 1. 如何为测试加上“构造”和“析构”器
  • 2. 如何依次串行测试?
  • 总结

本篇是《用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门》系列博文的进阶学习,希望大家喜欢。

那还等什么呢?Let‘s Testing!!!😉


1. 如何为测试加上“构造”和“析构”器

在以往的 XCTest 测试系统中,我们是用 XCTestCase 派生子类中的特定方法来完成每个测试的初始化和清理操作的:

final class MyUnitTests: XCTestCase {// 初始化测试override func setUpWithError() throws {continueAfterFailure = false}// 清理测试override func tearDownWithError() throws {}
}

而在新的 Swift Testing 中,我们只需使用类型本就具有的构造和析构器即可。

比如在下面的测试中,我们将所有独立的测试方法一并放到 ModelTests 结构中,然后借助结构的构造器来完成测试的初始化工作:

struct ModelTests {let container: ModelContainer// 测试前的所有初始化操作统统进来!!!init() throws {let config = ModelConfiguration(isStoredInMemoryOnly: true)container = try ModelContainer(for: User.self, configurations: config)}@Test func verifyBulkImport() throws {User.bulkImport()let modelContext = ModelContext(container)let count = try modelContext.fetchCount(FetchDescriptor<User>())#expect(count == 100)}
}

类似的,如果我们需要在测试之后完成一些必要的清理工作,同样可以将上面的结构“升级”为类,然后利用类的析构方法来搞定它们:

class ModelTests {let container: ModelContainerinit() throws {let config = ModelConfiguration(isStoredInMemoryOnly: true)container = try ModelContainer(for: User.self, configurations: config)}// 利用类的析构器来将测试之后的一切清理干净!deinit {container.deleteAllData()}@Test func verifyBulkImport() throws {User.bulkImport()let modelContext = ModelContext(container)let count = try modelContext.fetchCount(FetchDescriptor<User>())#expect(count == 100)}
}

如您所见:在 Swift Testing 中我们没有搞任何“特殊行为”,仅仅借助结构和类的“原始本能”即可轻松将测试的初始化和清扫工作化为无形,就问大家赞不赞呢?

2. 如何依次串行测试?

在包含海量 Testing 方法的单元测试中,为了达到客观的“公平公正”,我们往往需要这些方法随机执行:即每次测试它们的执行顺序都是不确定的。这样做到好处是可以将可能出现的代码依赖关系降到最低。

这还不算完!为了最大化保证测试的“实事求是”,我们还需要这些测试的执行可以重叠,即它们可以并发运行

struct ModelTests {var model = Model.shared@Test("测试创建 Itmes", .tags(.createItem))mutating func createItems() {print("#1 start")model.createItems()#expect(!model.items.isEmpty, "应该成功创建若干 Items!")print("#1 end")}@Test("测试删除所有 Item")mutating func delItem(){print("#2 start")model.createItems()#expect(!model.items.isEmpty)model.deleteAllItems()#expect(model.items.isEmpty, "应该成功删除所有 Items!")print("#2 end")}@Test("无厘头测试")mutating func noHead(){print("#3 start")#expect(true)print("#3 end")}
}

在上面的 ModelTests 测试中,多次运行可以发现其中 3 个测试方法的执行顺序皆是变幻无穷。甚至某个方法还未完成,另一个方法就“跃跃欲试”了:

Test run started.Testing Library Version: 102 (arm64-apple-ios13.0-simulator)Suite ModelTests started.Test "测试创建 Itmes" started.Test "测试删除所有 Item" started.Test "无厘头测试" started.
#2 start
#3 start
#2 end
#3 end
✔ Test "测试删除所有 Item" passed after 0.001 seconds.Test "无厘头测试" passed after 0.001 seconds.
#1 start
#1 end
✔ Test "测试创建 Itmes" passed after 0.001 seconds.Suite ModelTests passed after 0.001 seconds.Test run with 3 tests passed after 0.001 seconds.

但在某些场景中,我们可能也需要测试方法能够按照它们定义的顺序依次串行执行。这在 Swift Testing 里非常容易,简直轻而易举!

只需使用 @Suite 宏即可优雅的“樽前月下”:

在这里插入图片描述

更具体的说,在 @Suite 宏的若干 SuiteTrait 中包含一个 serialized 特性,它就是测试里我们那个“真命天子”:

在这里插入图片描述

还拿上面的 ModelTests 测试结构来说,其中的内容无需做任何改变,只需用 @Suite 宏如此这般修饰它即可:

@Suite(.serialized)
struct ModelTests {...}

再次运行测试可以看到,所有测试方法都会“言听计从”的自上而下串行执行了:

Test run started.Testing Library Version: 102 (arm64-apple-ios13.0-simulator)Suite ModelTests started.Test "测试创建 Itmes" started.
#1 start
#1 end
✔ Test "测试创建 Itmes" passed after 0.001 seconds.Test "测试删除所有 Item" started.
#2 start
#2 end
✔ Test "测试删除所有 Item" passed after 0.001 seconds.Test "无厘头测试" started.
#3 start
#3 end
✔ Test "无厘头测试" passed after 0.001 seconds.Suite ModelTests passed after 0.001 seconds.Test run with 3 tests passed after 0.001 seconds.

当然如果我们希望的话,还可以利用 @Suite 宏丰富多彩的构造器来让测试更加“银杏化”:

@Suite("大熊猫侯佩的大测试", .serialized)
struct ModelTests {...}

在这里插入图片描述

现在,相信小伙伴们对 Xcode 16 中崭新的 Swift Testing 都轻车熟路、了如指掌了吧?棒棒哒!💯


更多关于 Swift Testing 测试系统的介绍,请小伙伴们移步如下链接观赏精彩的内容:

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

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

在这里插入图片描述

  • 《Swift语言开发精讲》

总结

在本篇博文中,我们进一步讨论了 WWDC24(Xcode 16)中全新 Swift Testing 的驾驭之道,并用多个轻巧的“栗子”让小伙伴们明白晓畅。

感谢观赏,再会啦!😎

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

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

相关文章

k8s-service、endpoints、pod之间是怎么进行网络互通的

k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不同服务pod内部间访问 1、service 在K8S中&#xff0c;Service是一种抽象&#xff0c;定义了一组Pod的逻辑集合和访问这些Pod的策略。首先&#xff0c;我们需…

命令行工具PowerShell使用体验

命令行工具PowerShell使用 PowerShell是微软开发的一种面向对象的命令行Shell和脚本语言环境&#xff0c;它允许用户通过命令行的方式管理操作系统。相较于传统CMD&#xff0c;PowerShell增加了面向对象的程序设计框架&#xff0c;拥有更强大的功能和扩展性。使用PowerShell可…

企业IT架构转型之道:阿里巴巴中台战略思想与架构实战感想

文章目录 第一章&#xff1a;数据库水平扩展第二章&#xff1a;中台战略第三章&#xff1a;阿里分布式服务架构HSF&#xff08;high speed Framework&#xff09;、早期Dubbo第四章&#xff1a;共享服务中心建设原则第五章&#xff1a;数据拆分实现数据库能力线性扩展第六章&am…

【优选算法篇】微位至简,数之恢宏——解构 C++ 位运算中的理与美

文章目录 C 位运算详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;位运算基础应用1.1 判断字符是否唯一&#xff08;easy&#xff09;解法&#xff08;位图的思想&#xff09;C 代码实现易错点提示时间复杂度和空间复杂度 1.2 丢失的数字&#xff08;easy&#xff0…

在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;数据绑定机制是其核心功能之一&#xff0c;广泛用于连接应用程序的UI&#xff08;用户界面&#xff09;和应用程序的业务逻辑层。数据绑定允许你将UI元素与数据源&#xff08;如对象、集合或其他数…

基于 STM32 的天气时钟项目中添加天气数据的网络获取功能

基于 STM32 的天气时钟项目中添加天气数据的网络获取功能&#xff0c;您需要确保您的开发环境具备网络连接能力。这里以 ESP8266 Wi-Fi 模块为例&#xff0c;详细说明如何实现网络获取天气数据的功能。 1. 硬件连接 连接 ESP8266 模块 请参考以下连接方式&#xff0c;将 ESP82…

晓宇电视 1.9 | 电视直播软件,几千频道,高清秒播

晓宇电视是一款电视直播软件&#xff0c;提供数千个高清频道&#xff0c;支持秒播。最大的特色是没有广告&#xff0c;且不需要用户手动更新源地址。安装后即可使用&#xff0c;频道节目丰富&#xff0c;包括影视剧轮播专区&#xff0c;用户可以轻松观看喜爱的电影和电视剧。软…

双指针算法的妙用:提高代码效率的秘密(2)

双指针算法的妙用&#xff1a;提高代码效率的秘密&#xff08;2&#xff09; 前言&#xff1a; 小编在前几日讲述了有关双指针算法两道题目的讲解&#xff0c;今天小编继续进行有关双指针算法习题的讲解&#xff0c;老规矩&#xff0c;今天还是两道题目的讲解&#xff0c;希望…

MySQL:客户端工具创建数据库

MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;用于存储、管理和检索数据。MySQL是基于SQL语言的&#xff0c;它具有高效、可靠、易用的特点。 客户端工具 这个mysqld.exe就在计算机安装的数据可服务&#xff0c;启动之后&#xff0c;mys…

使用python向钉钉群聊发送消息

使用python向钉钉群聊发送消息 一、在钉钉群中新建机器人二、使用代码发送消息 一、在钉钉群中新建机器人 在群设置中添加机器人 选择自定义 勾选对应的安全设置 完成后会展示webhook&#xff0c;将地址复制出来&#xff0c;并记录&#xff0c;后面会用到 二、使用代码发送消…

【芯智雲城】Sigmastar星宸科技图传编/解码方案

一、图传技术简介 图传是指将图像或媒体内容从一个设备传输到另外一个设备的技术&#xff0c;传输的媒介可以是无线电波、光纤、以太网等。图传系统主要由图像采集设备、传输设备和接收设备组成&#xff0c;图像采集设备负责采集实时图像&#xff0c;传输设备将采集到的图像转…

sql专题 之 常用命令

文章目录 查询基础语法查询全表查询选择查询&#xff1a;常量和运算&#xff1a; 条件查询where运算符&#xff1a;、 !、<、>空值&#xff1a;null模糊查询&#xff1a;like逻辑运算&#xff1a;and or not 去重&#xff1a;distinct排序&#xff1a;order by截断和偏移…

Linux学习笔记之定时任务调度

crond 任务调度 任务调度&#xff1a;指系统在某个时间执行的特定的命令或程序 任务调度分类&#xff1a;1.系统工作&#xff1a;有些重要的工作必须周而复始地执行&#xff0c;如病毒扫描等。 2.个别用户工作&#xff1a;个别用户可能希望执行某些程序&#xff0c;如对mysql数…

MyBatisPlus 用法详解

文章目录 一、快速入门1.1 引入依赖&#xff1a;1.2 定义 Mappper&#xff1a;1.3 使用演示&#xff1a;1.4 常见注解&#xff1a;1.4.1 TableName:1.4.2 TableId&#xff1a;1.4.3 TableField&#xff1a; 1.5 常见配置&#xff1a; 二、核心功能2.1 条件构造器&#xff1a;2.…

C++ -- 多态与虚函数

多态 概念 多态&#xff08;polymorphishm&#xff09;&#xff1a;通常来说&#xff0c;就是指事物的多种形态。在C中&#xff0c;多态可分为编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;&#xff0c;这里我们重点讲的是运行时多…

ORU 的 Open RAN 管理平面 (M 平面)

[TOC](ORU 的 Open RAN 管理平面 (M 平面)) ORU 的 Open RAN 管理平面 (M 平面) https://www.techplayon.com/open-ran-management-plane-m-plane-for-open-radio-unit/ ORU M 平面 在 ORAN 中&#xff0c;设置参数的 O-RU 管理功能是通过 M-Plane 完成的。管理功能包括 O-…

使用Go语言编写一个简单的NTP服务器

NTP服务介绍 NTP服务器【Network Time Protocol&#xff08;NTP&#xff09;】是用来使计算机时间同步化的一种协议。 应用场景说明 为了确保封闭局域网内多个服务器的时间同步&#xff0c;我们计划部署一个网络时间同步服务器&#xff08;NTP服务器&#xff09;。这一角色将…

电信网关配置管理系统 upload_channels.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

STM32H503开发(2)----STM32CubeProgrammer烧录

STM32H503开发----2.STM32CubeProgrammer烧录 概述硬件准备视频教学样品申请源码下载参考程序自举模式BOOT0设置UART烧录USB烧录 概述 STM32CubeProgrammer (STM32CubeProg) 是一款用于编程STM32产品的全功能多操作系统软件工具。 它提供了一个易用高效的环境&#xff0c;通过…

计算机【基础篇】

-- 选择偶然 操作系统&#xff0c;是程序员写出来的一个用于操控机器硬件的 所谓电脑就是第一台计算机&#xff0c;计算机就是能够接受用户输入的指令和资料&#xff0c;并且通过计算机的中央处理器&#xff08;CPU是计算机的大脑&#xff09;进行数学和逻辑运算后&#xff0c…