- 测试
- 开发工具
【免费下载链接】Quick
The Swift (and Objective-C) testing framework.
Quick 仓库自带 Swift 与 Objective-C 两种语言的测试文件模板(File Templates),安装后即可在 Xcode 的 New File 面板中一键生成QuickSpec测试类和QuickConfiguration配置类骨架,大幅减少手写样板代码。本文以 Documentation/zh-cn/InstallingFileTemplates.md 为骨架,结合仓库内 Rakefile 与Quick Templates目录下的真实模板实现,完整讲解 Alcatraz 一键安装、Rakefile 手动安装/卸载的全过程,并深入剖析模板目录结构与占位符替换原理,帮助你彻底理解并掌控 Quick 文件模板的安装与定制。
什么是 Quick 文件模板
Quick 模板的本质是 Xcode 的文本替换型文件模板(Xcode.IDEKit.TextSubstitutionFileTemplateKind),存放在仓库根目录的 Quick Templates 文件夹中。仓库提供了两类模板:
| 模板名称 | 用途 | 支持的实现语言 |
|---|---|---|
| Quick Configuration Class | 生成QuickConfiguration子类,用于在运行 spec 前配置 Quick 行为、定义跨文件共享的 Shared Examples | Swift、Objective-C |
| Quick Spec Class | 生成一个实现 Quick spec 的测试类 | Swift、Objective-C |
每个模板目录都遵循 Xcode File Template 的标准布局,以Quick Spec Class.xctemplate为例:
Quick Templates/ ├── Quick Configuration Class.xctemplate/ │ ├── Objective-C/ │ │ ├── ___FILEBASENAME___.h │ │ └── ___FILEBASENAME___.m │ ├── Swift/ │ │ └── ___FILEBASENAME___.swift │ ├── TemplateIcon.icns │ └── TemplateInfo.plist └── Quick Spec Class.xctemplate/ ├── Objective-C/ │ └── ___FILEBASENAME___.m ├── Swift/ │ └── ___FILEBASENAME___.swift ├── TemplateIcon.icns └── TemplateInfo.plist其中文件名中的___FILEBASENAME___是 Xcode 的内置占位符,创建文件时会自动替换为用户输入的文件名;TemplateInfo.plist则声明了模板的类型、描述、语言选项(Swift / Objective-C)以及各语言对应的主模板文件,具体解析见下文「模板结构深度解析」一节。
方式一:通过 Alcatraz 一键安装
Alcatraz 是 Xcode 的包管理器插件,Quick 模板已收录其中。安装步骤非常简单:
- 先安装 Alcatraz 插件;
- 在 Xcode 的包管理器窗口中搜索
Quick; - 在搜索结果中点击安装 Quick 模板。
安装完成后,Xcode 会自动将模板同步到用户目录下的 File Templates 目录,随后即可在 New File 对话框中直接使用。需要说明的是,这种方式依赖第三方插件生态,且 Alcatraz 的兼容性与 Xcode 版本强相关;如果更希望安装过程可控、可审计,推荐使用下文基于 Rakefile 的手动安装方式。
方式二:使用 Rakefile 手动安装
手动安装的核心思路是:克隆 Quick 仓库,然后运行仓库 Rakefile 中定义的templates命名空间任务,将模板复制到 Xcode 的用户模板目录。
安装模板
$ git clone https://gitcode.com/gh_mirrors/qu/Quick.git $ rake templates:install命令执行后,模板会被安装到:
~/Library/Developer/Xcode/Templates/File Templates/Quick安装后重启 Xcode(或等待文件系统同步),在新建文件时即可看到 Quick 分类下的两个模板。
卸载模板
$ rake templates:uninstall该命令会直接删除上述安装目录,恢复环境原状。
Rakefile 实现原理
打开仓库根目录的 Rakefile,可以看到templates命名空间的两个任务实现非常直白:
namespace "templates" do install_dir = File.expand_path("~/Library/Developer/Xcode/Templates/File Templates/Quick") src_dir = File.expand_path("../Quick Templates", __FILE__) desc "Install Quick templates" task :install do if File.exists? install_dir raise "RAKE TASK FAILED: Quick templates are already installed at #{install_dir}" else mkdir_p install_dir cp_r src_dir, install_dir end end desc "Uninstall Quick templates" task :uninstall do rm_rf install_dir end end几个值得注意的实现细节:
- 目标路径:
install_dir被硬编码为~/Library/Developer/Xcode/Templates/File Templates/Quick,这正是 Xcode 读取用户级 File Template 的标准目录; - 源目录:
src_dir指向仓库内的Quick Templates目录(即../Quick Templates相对 Rakefile 所在位置); - 幂等保护:
install任务在目标目录已存在时会抛出RAKE TASK FAILED错误,避免重复安装覆盖已有模板。此时你需要先运行rake templates:uninstall清空旧目录,再重新安装; - 卸载即删除:
uninstall任务用rm_rf递归删除整个安装目录,操作不可逆,卸载前请确认目录内没有自行添加的定制模板。
模板结构深度解析
为了让你在安装后能熟练使用、甚至自定义模板,下面结合仓库内的真实文件逐一拆解两类模板。
Quick Spec Class:生成测试类
Swift 版本的模板文件位于 Quick Templates/Quick Spec Class.xctemplate/Swift/FILEBASENAME.swift:
import Quick import Nimble class ___FILEBASENAMEASIDENTIFIER___: QuickSpec { override class func spec() { } }生成后的类继承自QuickSpec,并在spec()类方法中留出书写describe/context/it等用例的空位。___FILEBASENAMEASIDENTIFIER___是 Xcode 的另一个内置占位符,它会把文件名转换为合法的 Swift 标识符(例如文件名为FooTests时生成FooTests类)。
Objective-C 版本位于 Quick Templates/Quick Spec Class.xctemplate/Objective-C/FILEBASENAME.m,利用 Quick 提供的宏定义来包裹用例体:
@import Quick; @import Nimble; QuickSpecBegin(___FILEBASENAMEASIDENTIFIER___) QuickSpecEndQuickSpecBegin(name)与QuickSpecEnd宏在 Sources/QuickObjectiveC/DSL/QCKDSL.h 中定义,QuickSpecBegin展开为一个继承QuickSpec的接口与实现声明,QuickSpecEnd负责收尾闭合,二者之间就是spec()方法体,供你直接书写用例。
Quick Configuration Class:生成全局配置类
Swift 版本模板位于 Quick Templates/Quick Configuration Class.xctemplate/Swift/FILEBASENAME.swift:
import Quick class ___FILEBASENAMEASIDENTIFIER___: QuickConfiguration { override class func configure(_ configuration: Configuration) { } }configure(_:)在 Sources/Quick/Configuration/QuickConfiguration.swift 中定义为open class func,每个QuickConfiguration子类的该方法会在 Quick 运行任何 example 之前被调用,典型用途包括:修改Configuration对象上的行为属性、通过sharedExamples定义跨文件复用的共享用例。需要注意,多个子类的configure(_:)执行顺序没有保证,对同一属性做多次赋值属于未定义行为。
Objective-C 版本由头文件与实现文件组成,头文件 Quick Templates/Quick Configuration Class.xctemplate/Objective-C/FILEBASENAME.h 声明继承自QuickConfiguration的接口:
@import Quick; @interface ___FILEBASENAMEASIDENTIFIER___ : QuickConfiguration @end实现文件 Quick Templates/Quick Configuration Class.xctemplate/Objective-C/FILEBASENAME.m 中重写+configure:方法:
#import "___FILEBASENAMEASIDENTIFIER___.h" @implementation ___FILEBASENAMEASIDENTIFIER___ + (void)configure:(Configuration *)configuration { } @endTemplateInfo.plist:模板的元数据声明
每个模板目录下的TemplateInfo.plist负责向 Xcode 描述模板能力。以 Quick Spec Class.xctemplate 的 TemplateInfo.plist 为例,关键字段包括:
| plist 字段 | 取值 | 含义 |
|---|---|---|
Kind | Xcode.IDEKit.TextSubstitutionFileTemplateKind | 声明这是一个文本替换型文件模板 |
BuildableType | Test | 标记该模板产物属于测试目标 |
DefaultCompletionName | Spec | 新建文件时的默认文件名后缀 |
Options中的productName | text 类型、必填 | 让用户在新建面板输入 Spec 类名 |
Options中的languageChoice | popup 类型,取值为Swift/Objective-C | 让用户选择实现语言,并通过MainTemplateFiles映射到对应语言的主模板文件 |
其中MainTemplateFiles将语言选项与具体文件关联起来:
<key>MainTemplateFiles</key> <dict> <key>Objective-C</key> <string>___FILEBASENAME___.m</string> <key>Swift</key> <string>___FILEBASENAME___.swift</string> </dict>Quick Configuration Class.xctemplate 的 TemplateInfo.plist 结构与前者基本一致,只是Description/Summary文案不同,并额外说明了该类用于“配置运行 spec 时的行为、定义跨 spec 文件使用的共享用例”。
安装后的使用方式
模板安装完成后,在 Xcode 中依次执行:
File→New→File...(快捷键⌘N);- 在模板选择器中找到
Quick分类(或直接搜索Quick); - 选择
Quick Spec Class或Quick Configuration Class; - 填写类名、选择实现语言(Swift / Objective-C),点击 Next 完成创建。
生成的测试类可以直接运行:Swift 版QuickSpec子类会被 XCTest 自动发现并执行spec()中的用例;Objective-C 版经QuickSpecBegin/QuickSpecEnd宏展开后行为一致。
常见问题与注意事项
- 安装目录已存在:
rake templates:install会因目录已存在而报错,先执行rake templates:uninstall再重装即可;若你已手动向该目录添加过定制模板,请先做好备份,因为卸载会删除整个目录。 - Xcode 未显示模板:确认模板被安装到了
~/Library/Developer/Xcode/Templates/File Templates/Quick这一标准位置,必要时重启 Xcode。 - 模板版本与 Quick 版本匹配:仓库内模板默认同时
import Quick与import Nimble,请确保测试 target 已正确集成 Quick 与 Nimble(参见 Documentation/zh-cn/InstallingQuick.md)。 - 自定义模板:理解了
___FILEBASENAME___、___FILEBASENAMEASIDENTIFIER___等占位符与TemplateInfo.plist的字段含义后,你可以基于仓库模板复制出自己的 xctemplate 目录,按需增删describe/context骨架或修改 import 列表,再手动放入 Xcode 的模板目录即可生效。
小结
Quick 文件模板的价值在于把「新建测试文件 → 手写类声明与 import」的重复劳动压缩为一次模板选择:Alcatraz 适合追求速度的场景,Rakefile 手动安装则提供了完全可控、可审计的安装/卸载流程。结合本文对 Rakefile 实现与 Quick Templates 模板文件的源码级拆解,你不仅能顺利完成安装,还能在需要时轻松定制出符合团队规范的专属 Quick 测试模板。
- 测试
- 开发工具
【免费下载链接】Quick
The Swift (and Objective-C) testing framework.
相关推荐
lefthook 安装完全指南:包管理器、系统发行版与二进制手动安装全解析
lefthook 安装完全指南:包管理器、系统发行版与二进制手动安装全解析 Lefthook 是一个以“独立、零依赖二进制”形式分发的 Git hooks 管理
开发工具gitignore 模板库与安装指南:用户安装文档的管理
gitignore 模板库与安装指南:用户安装文档的管理 引言:你还在手动编写.gitignore文件吗? 作为开发者,你是否曾因项目中充斥大量临时文件、日志或
Ceph 存储集群手动安装指南:APT/RPM 软件包安装与源码构建安装全解析
Ceph 存储集群手动安装指南:APT/RPM 软件包安装与源码构建安装全解析 本篇指南详细讲解如何在 Ceph 节点上 手动安装 Ceph 存储集群软件 ——
存储分布式文件系统对象存储后端高可用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考