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

news2024/11/23 19:39:41

在这里插入图片描述

概述

从 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 项目中,并用一个鲜活的例子讨论了它的金辉玉洁。

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

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

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

相关文章

docker配置mysql8报错 ERROR 2002 (HY000)

通过docker启动的mysql,发现navicat无法连接,后来进入容器内部也是无法连接,产生以下错误 root9f3b90339a14:/var/run/mysqld# mysql -u root -p Enter password: ERROR 2002 (HY000): Cant connect to local MySQL server through socket …

LINUX1.5.1(vim编辑器)

vim: 1. vim 2.vim /PATTERN vi编辑器与三种常见的模式: 复制 粘贴 剪切 删除 编辑 退出 保存 行间跳转 显示行号 查找替换 命令模式:光标的移动,使用快捷键,复制,粘贴,删除等基础操作 编辑模式&…

【mysql进阶】4-7. 通用表空间

通⽤表空间 - General Tablespace 1 通⽤表空间的作⽤和特性? ✅ 解答问题 通⽤表空间是使⽤ CREATE tablespace 语法创建的共享InnoDB表空间 通⽤表空间能够存储多个表的数据,与系统表空间类似也是共享表空间; 服务器运⾏时会把表空间元数…

【C++】智能指针:解决内存泄漏、悬空指针等问题

⭐️个人主页:小羊 ⭐️所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言一、RAII二、智能指针原理三、auto_ptr四、unique_ptr五、shared_ptr第一步:实现出RAII的框架第二步:如何…

信息收集-shodan专题一

shodan介绍 一、shodan简介 1.工作原理解析: 2.优缺点 3.功能 二、安装shodan流程 三、shodan使用方法 1.搜索 1.1.search 搜索 1.2. count 总数 1.3. download 下载与解析 2. 指定查看 2.1 指定IP的详细信息 2.2 hostname: 搜索指定的域名 2.3 port:…

百度智能云推出11.11活动,各大云厂商香港服务器优惠活动汇总

2024年双十一活动就要来了,作为百度集团旗下的云智能服务平台——百度智能云今年率先开始了11.11狂欢购活动,上新促销活动的动作如此之快,难道是百度云要大发力了?感觉今年百度智能云要比阿里云、腾讯云、硅云、华为云等厂商更加卖…

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目,所以这里就结合一下,在搭建 k8s 集群后安装运维常用服务,比如 ansible 和 prometheus,用 NFS 实现数据存储同步&#xff0c…

[Ansible实践笔记]自动化运维工具Ansible(二):Ansible的playbook及角色

Ansible playbook(剧本) 详情请参考[Ansible实践笔记]自动化运维工具Ansible(一):初探ansible&ansible的点对点模式 文章目录 Ansible playbook(剧本)介绍核心字段环境配置案例&#xff1…

寻找大自然的颜色

走在停停,停停走走,恍惚间一天过去了,转瞬间一年过去了,身边的一切在变化又不在变化,生活是自己的又不是自己的。 今天是个特殊的日子,其实前几天对我而言就算特殊的日子了,一个心里暗暗等待着却…

HTTP协议相关知识点

1,概念理解 HTTP(超文本传输协议),是一种建立在TCP上的无状态连接, 工作流程:客户端发送一个HTTP请求,说明想要访问的资源和请求的方式,服务端收到请求后进行处理,根据请求的方式访问服务器资源…

Android View的事件分发机制

前言 本文由于介绍本人关于View的事件分发机制的学习,如有不恰当的描述欢迎指出。 View基础 什么是View ​ View是Android中所有控件的基类,不管是Button、TextView、LinearLayout,它们的共同基类都是View。也就是说,View是界…

【C++进阶篇】——STL的简介

【C进阶篇】——STL的简介 1.什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

Github优质项目推荐(第八期)

文章目录 Github优质项目推荐 - 第八期一、【manim】,66.5k stars - 创建数学动画的 Python 框架二、【siyuan】,19.5k stars - 个人知识管理软件三、 【GetQzonehistory】,1.3k stars - 获取QQ空间发布的历史说说四、【SecLists】&#xff0…

<Project-11 Calculator> 计算器 0.3 年龄计算器 age Calculator HTML JS

灵感 给工人发工资是按小时计算的,每次都要上网,我比较喜欢用 Hours Calculator ,也喜欢它的其它的功能, 做个类似的。 我以为是 Python,结果在学 javascript 看 HTML,页面的基础还停留在 Frontpage 2000…

leetCode算法题爬楼梯递归写法

题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 1 阶2. 2 阶 …

互联网的无形眼睛:浏览器指纹与隐私保护攻略

你是否曾有过这样的经历:在某个电商网站上搜索了某件商品,随后无论你打开哪个网页,都能看到与之相关的广告?或者当你再次访问某个网站时,它居然记得你之前的浏览记录?这一切,背后都有一只“看不…

GEE引擎架设好之后进游戏时白屏的解决方法——gee引擎白屏修复

这两天测试GeeM2引擎的服务端,最常见的问题就是点击开始游戏出现白屏,最早还以为是服务端问题,结果是因为升级了引擎,而没有升级NewUI这份文件导致的。解决方法如下: 下载GEE引擎包最新版,(可以…

vue+spreadjs开发

创建vue3项目 pnpm create vite --registryhttp://registry.npm.taobao.org安装spreadjs包 pnpm install "grapecity-software/spread-sheets17.1.7" "grapecity-software/spread-sheets-resources-zh17.1.7" "grapecity-software/spread-sheets-vu…

Linux操作进程

前言 这次的主要内容就是进程的实操,主要是进程创建,进程终止,进程等待和进程程序替换,最后我们在手写一个简单的shell 1.进程创建 进程创建就是fork,所以我们就讲一些知识性的就可以了 首先在创建子进程的时候&…

【ArcGIS Pro实操第5期】全局及局部空间插值:GPI、LPI、IDW等

ArcGIS Pro实操第5期:全局及局部空间插值 ArcGIS Pro-用于空间插值的丰富工具箱实操:空间插值方法1:Trend Surface Model for Interpolation-以降水数据为例方法2:Kernel Density Estimation Method-以单位面积鹿的目击数为例方法…