用接地气的例子趣谈 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 XCTest

final 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 Foundation

fileprivate let fakeNames = ["黄飞鸿", "齐天大圣", "黑神话悟空"]

struct Item {
    let name: String
    let age: Int
    let power: Double
    let isImmortal: Bool
    
    static 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]()
    
    mutating
    func createItems() {
        items = Item.createTestItems()
    }
    
    mutating
    func deleteAllItems() {
        items.removeAll()
    }
}

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

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

import Testing
@testable import SwiftTestDEMO

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

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

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

在这里插入图片描述

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


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

在这里插入图片描述

  • 《Swift 语言开发精讲》

总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM美容院管理系统的设计

管理员账户功能包括:系统首页,个人中心,用户管理,套餐类型管理,美容预约管理,生日提醒管理,管理员管理,系统管理 员工账号功能包括:系统首页,个人中心&#…

普推知产:申请商标名称从4字改成3字下了初审!

近日7月的时候普推知产老杨帮客户申请的水果猕猴桃31类商标,初步审定公告下来了,基本没什么问题三个月公告结束后一个月内就可以拿到商标注册证,客户所在地全国有名猕猴桃之县,同质化竞争还得需要商标才可以。 刚开始了解到这位做…

Three.js遮罩多场景穿梭过渡

仓库 思路: 渲染一个遮罩 亮的区域为需要显示另一个场景的区域 在靠近门时完全渲染一个场景 在穿过门的同时切换场景关系 if (this.Doors.length) {// 材质变为黑色 除了“门”toggleRoughnessMaterial("black");// 设置RenderTarget保存结果renderer.se…

【Linux系统】为什么环境变量具有全局性?共享?写时拷贝优化?

环境变量表具有全局性的原因: 环境变量表之所以具有全局性的特征,主要是因为它们是在进程上下文中维护的,并且在大多数操作系统中,当一个进程创建另一个进程(即父进程创建子进程)时,子进程会继承…

网站建设前需要搞清楚哪些问题

网站建设前需要搞清楚的问题涉及多个方面,以下是一些关键问题的概述: 明确目标和目的 企业宣传与品牌塑造:网站是企业展示形象、传播品牌的重要窗口。通过精心设计的网站界面和内容布局,可以向潜在客户传递企业的价值观、文化理念…

iOS AVAudioSession 详解【音乐播放器的配置】

前言 在 iOS 音频开发中,AVAudioSession 是至关重要的工具,它控制着应用的音频行为,包括播放、录音、后台支持和音频中断处理等。对于音乐播放器等音频需求强烈的应用,设计一个合理的 AVAudioSession 管理体系不仅能保证音频播放…

[JAVAEE] 多线程的案例(三) - 线程池

目录 一. 什么是线程池 二. 线程池的作用 三. java提供的线程池类 四. ThreadPoolExecutor的构造方法及参数理解 1. int corePoolSize: 核心线程数. 2. int maximumPoolSize: 最大线程数 核心线程数 非核心线程数 3. int keepAliveTime:非核心线程允许空闲的最大时间. …

网络通信与并发编程(六)线程、进程池与线程池

线程、进程池与线程池 文章目录 线程、进程池与线程池一、线程二、线程的相关操作2.1创建线程的两种方式2.2线程的其他操作2.3死锁现象和递归锁2.4条件2.5定时器2.6 队列与堆栈 三、进程池与线程池 一、线程 线程是指cpu上实际执行计算的单位,而进程是将计算所需资…

Leetcode刷题笔记12

HJ1 字符串最后一个单词的长度 字符串最后一个单词的长度_牛客题霸_牛客网 这里可以使用rfind(),rfind()函数从字符串的末尾向前查找第一个空格的位置。这个空格将是最后一个单词和前面的单词的分隔符。首先使用getline读取字符串,然后用rfind找到最后一…

class 36 二叉树高频题目 - 上 (不含有树形dp)

1. BFS 的两种方式 如下图, 是一个二叉树. 我们需要按照层的方式来遍历这棵树. 1.1 使用 JDK 自带的类实现(链表实现, 经典 BFS) 首先我们实现一个队列, 这个队列从头进, 从尾出.然后将根节点放入其中, 然后将放入的节点弹出,然后继续验证弹出的节点有没有左孩子, 若是有, 将…

便捷之选:微信小程序驱动的停车场管理系统

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅获取源码联系方式请查看文末🍅 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目…

跨境支付,哪些国产数据库能接得住?

最近有一个非常重大的事件,那就是10月22日-24日的金砖国家会议。金砖国家领导人第十六次会晤是金砖国家进一步凝聚共识、以实际行动推动“全球南方”共同发展进步的重要机遇。 酝酿已久的金砖跨境支付体系,也在这次峰会中正式推出。金砖国家的支付系统一…

国内大语言模型哪家更好用?

大家好,我是袁庭新。 过去一年,AI大语言模型在爆发式增长,呈现百家争鸣之态。国内外相关厂商积极布局,并相继推出自家研发的智能化产品。 我在工作中已习惯借助AI来辅助完成些编码、创作、文生图等任务,甚至对它们产…

【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构

从零开始认识IP协议 1 网络层协议1.1 初步认识IP协议1.2 初步理解IP地址 2 IP协议报头3 初步理解网段划分 1 网络层协议 1.1 初步认识IP协议 我们已经熟悉了传输层中的UDP和TCP协议,接下来我们来接触网络层的协议: 网络层在计算机网络中的意义主要体现…

线段树

文章目录 1 线段树概念2 线段树操作2.1 建树2.2 区间修改2.3 区间查询2.4 练习题目 3 线段树进阶3.1 乘法线段树 * 补充:快读快写4 End 1 线段树概念 线段树 ( S e g m e n t T r e e ) (Segment\ Tree) (Segment Tree) 是 O I OI OI 中的常用算法。线段树是一种…

PHP-FPM 性能配置优化

4 核 8 G 服务器大约可以开启 500 个 PHP-FPM,极限吞吐量在 580 qps (Query Per Second 每秒查询数)左右。 Nginx php-fpm 是怎么工作的? php-fpm 全称是 PHP FastCGI Process Manager 的简称,从名字可得知&#xff…

基于SSM的冰淇淋在线购买网站【附源码】

基于SSM的冰淇淋在线购买网站 效果如下: 系统首页界面 用户登录界面 冰淇淋页面 每日秒杀页面 个人中心界面 管理员登录界面 管理员功能界面 口味管理界面 冰淇淋管理界面 每日秒杀管理界面 视频教学管理界面 研究背景 近些年,随着中国经济发展&#…

订购 Claude AI 的第二天 它独自完成 文字转语音 flask应用

图二里,删除几个无关的 chats 全程我做的工作:向 AI 提要求,copy / paste 代码,在venv验证运行,向 AI 反馈,总共用了3个 chats.(图中的只有一个 Chat, 删掉的另外两个: Python 库安…

海外云手机实现高效的海外社交媒体营销

随着全球化的深入发展,越来越多的中国企业走向国际市场,尤其是B2B外贸企业,海外社交媒体营销已成为其扩大市场的重要手段。在复杂多变的海外市场环境中,如何有效提高营销效率并降低运营风险,成为了众多企业的首要任务。…

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一,预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二,select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…