Quick 入门实战:在 Xcode 项目中配置 Swift / Objective-C 单元测试
测试开发工具【免费下载链接】QuickThe Swift (and Objective-C) testing framework.项目地址https://gitcode.com/gh_mirrors/qu/Quick点击查看免费下载本篇指南围绕 Quick 测试框架的使用前置环节——在 Xcode 工程中正确搭建测试 Target 与跨语言测试桥接系统讲解 Swift 与 Objective-C 四种组合Swift 测 Swift、Swift 测 Objective-C、Objective-C 测 Swift、Objective-C 测 Objective-C的配置步骤并补充命令行工具项目测试 Target 的创建流程以及 Quick 在 XCTest 底层如何被发现的源码级原理。读完本文你将能在自己的 Xcode 项目中稳定接入 Quick 并让测试 Target 正常访问主 Target 的代码。本文基于当前仓库 SettingUpYourXcodeProject.md 编写源码证据来自 Sources 目录与 Quick.xcodeproj/project.pbxproj。在开始之前建议先阅读 安装 Quick 的三种方式Git Submodules / CocoaPods / Swift Package Manager并对照 README 中的 Swift 版本兼容表 选择与你的 Swift 版本匹配的 Quick、Nimble 版本。前置认知Xcode 默认的测试 Target 与访问主 Target 代码的前提除 Command Line Tool命令行工具项目类型外使用 Xcode 7 及以上版本新建项目时工程中会默认包含一个单元测试 Target。对于命令行工具项目需要手工创建具体步骤见下文「为命令行工具项目设置测试 Target」。要编写单元测试核心前提是测试 Target 能够使用主 Target 的代码。Xcode 默认生成的测试 Target 只是一个独立的 bundle它不会自动获得主模块的内部符号可见性需要按下面四种语言组合分别配置。用 Swift 测试 Swift 代码这是最常见的组合。需要完成两件事1. 将主 Target 的 Defines Module 设置为 YES在 Xcode 中操作选中你的项目Project进入 Build Settings找到 Packaging 分组下的 Defines Module将其值改为 Yes。注意如果你的 Build Settings 显示为 Basic基本可能看不到 Packaging 分组需要先切换为 All全部再查找。这一设置的意义在于它让 Xcode 为你的主 Target 生成一个 module模块后续testable import才能按模块名解析到主 Target 的代码。这也是 Swift 语言层面模块化的基本要求。2. 在测试文件中使用testable import导入主模块在测试代码中通过testable import导入你的应用模块名。这会把主模块中所有public与internal默认访问级别符号暴露给测试代码而private符号仍然不可访问。// MyAppTests.swift import XCTest testable import MyModule class MyClassTests: XCTestCase { // ... }为什么是testable而不是普通import普通import只能看到public级别的符号而单元测试经常需要验证模块内部实现细节例如内部结构体、内部方法testable import正是 Apple 为测试场景提供的访问通道。注意其使用前提就是上文第 1 步的 Defines Module YES两者缺一不可。结合源码理解Quick 如何借助 XCTest 发现测试配置好测试 Target 后Quick 的 Spec 会被 XCTest 自动发现并执行。其机制可以在仓库源码中看到QuickSpec.h 的注释说明了完整流程QuickSpec 是XCTestCase的子类当 Spec 类首次加载时[NSObject initialize]被调用QuickSpec 重写该方法来执行spec()从而构建 example group 并把示例注册到Quick.World这个全局注册表随后 XCTest 会查询测试方法列表。QuickSpec.m 重写了[XCTestCase testInvocations]遍历World中为该 Spec 类注册的每个 example动态为类添加实例方法并返回对应的NSInvocation。这些 invocation 就是最终被 XCTest 执行的测试其选择器名称会显示在 Xcode 的测试导航栏中在单条测试单独运行时点击导航栏中的单个测试XCTest 不会隐式调用defaultTestSuite因此 QuickSpec.m 还重写了instancesRespondToSelector:显式触发defaultTestSuite来保证 example 仍会被正确生成在 Swift Package Manager 场景下QuickSpec.swift 通过重写defaultTestSuite钩子调用QuickConfiguration.configureSubclassesIfNeeded完成全局配置并收集每个 Spec 类的 examples效果等同于 Linux 上在LinuxMain.swift中显式罗列 Spec 类。也就是说只要测试 Target 正确链接了 Quick.framework或通过 SwiftPM 添加了 Quick 依赖你的QuickSpec子类就会被 XCTest 运行时自动发现无需手动注册。用 Swift 测试 Objective-C 代码如果你要测试的代码是用 Objective-C 编写的需要让 Swift 测试文件能看到对应的头文件为测试 Target 添加一个桥接头文件Bridging Header在该桥接头文件中#import你要测试的代码所在的头文件。// MyAppTests-BridgingHeader.h #import MyClass.h配置完成后就可以在 Swift 测试文件中直接使用MyClass.h中声明的代码了。桥接头文件的工程配置在 Xcode 中桥接头文件的路径通过 Build Settings 中的SWIFT_OBJC_BRIDGING_HEADER指定。仓库自身的测试工程就是一个真实范例Quick.xcodeproj/project.pbxproj 中配置了SWIFT_OBJC_BRIDGING_HEADER Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h;该桥接头文件位于 Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h。Quick 自身同时维护 Swift 与 Objective-C 两套测试见 Tests/QuickTests/QuickTests/FunctionalTests/ObjC 下的*TestsObjC.m文件例如 ItTestsObjC.m正是依靠这个桥接头文件在同一个测试 Target 内打通两种语言。你可以照此模式为自己的测试 Target 添加桥接头文件。用 Objective-C 测试 Swift 代码Objective-C 无法直接看到 Swift 符号需要两个步骤用objc属性把你希望测试的 Swift 类与方法暴露给 Objective-C在单元测试中导入模块的 Swift 头文件即 Xcode 自动生成的模块名-Swift.h。import XCTest; #import MyModule-Swift.h interface MyClassTests: XCTestCase // ... end这里MyModule-Swift.h是 Xcode 在构建时为主 Target 自动生成的头文件它汇总了所有被objc暴露的 Swift 声明。注意Swift 中仅有objc标记且继承自NSObject或符合 ObjC 兼容条件的类型的符号才会出现在这个头文件中纯 Swift 泛型、private等声明不会出现。关于模块名的生成规则仓库中的 NSBundleCurrentTestBundle.swift 给出了参考实现模块名取自 bundle 文件名并转换为合法的 C99 extended identifier对应实现见 StringC99ExtendedIdentifier.swift。这解释了为什么-Swift.h前缀要使用符合 C 标识符规则的模块名。用 Objective-C 测试 Objective-C 代码这是最简单的组合直接在测试文件中导入被测代码的头文件即可。// MyAppTests.m import XCTest; #import MyClass.h interface MyClassTests: XCTestCase // ... end无需testableObjective-C 没有访问级别隔离到模块内部符号的机制也无需桥接头文件同为 Objective-C编译单元直接可见头文件声明。为命令行工具项目设置测试 Target命令行工具项目默认不含测试 Target按以下步骤创建在项目导航project pane中为你的工程添加一个 Target选择 OS X Unit Testing Bundle 模板编辑主 Target 的 Scheme选择 Test 节点点击 Info 标题下方的 按钮在弹出的列表中选择你的测试 bundle。完成这 5 步后命令行工具的主 Target 代码即可通过前文所述方式Swift 场景需先设置 Defines Module 并配合testable import被测试 Target 访问。需要注意的是命令行工具的测试同样遵循上述四种语言组合的配置规则。常见误用与已知限制不要直接把源码文件加入测试 Target一些开发者倾向于把 Swift 源文件直接拖入测试 Target 来共享代码。这不是推荐做法它会导致难以诊断的隐蔽错误详见 Quick 仓库 issue #91 的讨论例如同一类型在编译单元间产生符号重复、初始化顺序异常等问题。正确做法始终是使用testable importSwift或桥接头文件 /-Swift.h跨语言场景。Quick 在 Xcode Test Navigator 中的集成限制Quick 与 Xcode Test Navigator测试导航器的集成存在一些已知局限Quick 测试在运行过之后才会出现在测试导航器中重复运行往往会以不可预期的方式重置测试列表无法从源码编辑器左侧的 gutter行槽直接运行单个 Quick 测试。如果你希望 Apple 工程师改进这一体验可以向 Apple 提交 radar并标注为 rdar://26152293 的重复duplicate问题以提升权重。这一限制是 XCTest 运行时动态注入测试方法上文testInvocations机制的固有表现在运行之前XCTest 并不知道 Spec 中有哪些 example。隐私与发布注意Quick 仅用于测试不应被打包进提交到 App Store Connect 的二进制中详见 README 的隐私声明它依赖私有 API 与 Xcode 集成若被打包会导致应用被拒审。非 Apple 平台与 SwiftPM 场景下的补充以上配置均针对 macOS / iOS / tvOS 上的 Xcode 工程。如果你通过 Swift Package Manager 在 Linux 等非 Apple 平台使用 Quick测试的入口与 Xcode 场景不同由于 swift-corelibs-xctest 不支持自动发现 Spec 类需要在Tests/LinuxMain.swift中创建入口并调用QCKMain实现见 QuickMain.swift显式传入QuickSpec子类列表、可选的QuickConfiguration子类列表与额外的XCTestCase列表。在当前仓库的 Tests/LinuxMain.swift 中可以看到实际用法。而在 Apple 平台上使用 SwiftPM 时则不需要手写LinuxMain.swift如 QuickSpec.swift 注释所述XCTest 的自动发现机制由 Objective-C runtime 驱动defaultTestSuite钩子即可完成配置与 example 收集。当前仓库 Package.swift 声明的最低平台为 macOS 10.15 / iOS 13 / tvOS 13可作为你在 Apple 平台使用 SwiftPM 集成时的参考基线。小结配置检查清单场景核心配置测试代码中的关键语句Swift 测 Swift主 Target 设Defines Module YEStestable import MyModuleSwift 测 Objective-C测试 Target 配置桥接头文件SWIFT_OBJC_BRIDGING_HEADER桥接头文件中#import MyClass.hObjective-C 测 Swift被测 Swift 符号加objc#import MyModule-Swift.hObjective-C 测 Objective-C无额外配置#import MyClass.h命令行工具项目新建 OS X Unit Testing Bundle Target并在主 Target Scheme 的 Test 节点中添加同以上四种组合按照上述清单完成配置后即可在测试 Target 中import Quick参照 QuickExamplesAndGroups.md 编写describe/context/it风格的 BDD 测试并结合 NimbleAssertions.md 使用expect(...).to断言语法。赞分享测试开发工具【免费下载链接】QuickThe Swift (and Objective-C) testing framework.项目地址https://gitcode.com/gh_mirrors/qu/Quick点击查看免费下载相关推荐在 Xcode 项目中配置 Quick 测试环境Swift 与 Objective-C 四种测试组合的 Target 搭建指南在 Xcode 项目中配置 Quick 测试环境Swift 与 Objective C 四种测试组合的 Target 搭建指南 本篇指南以 Quick 官方文测试开发工具Quick 文件模板安装指南为 Xcode 配置 Swift 与 Objective-C 测试模板Quick 文件模板安装指南为 Xcode 配置 Swift 与 Objective C 测试模板 Quick 仓库自带一套面向 Swift 与 Object测试开发工具在 Xcode 项目中配置 Quick 单元测试四种语言组合与测试 target 搭建完整指南在 Xcode 项目中配置 Quick 单元测试四种语言组合与测试 target 搭建完整指南 Quick 是运行在 XCTest 之上的行为驱动开发BDD测试开发工具上一篇3分钟学会Python-for-Android用Python代码创建Android应用的终极指南下一篇3分钟搞定Mac Windows驱动安装Brigadier让你告别手动下载的烦恼创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

把过滤循环挪到凌晨 2 点跑:Home Assistant 里用 smarttub.set_primary_filtration 给热水浴缸省电

把过滤循环挪到凌晨 2 点跑:Home Assistant 里用 smarttub.set_primary_filtration 给热水浴缸省电

把过滤循环挪到凌晨 2 点跑:Home Assistant 里用 smarttub.set_primary_filtration 给热水浴缸省电 【免费下载链接】home-assistant.io :blue_book: Home Assistant User documentation 项目地址: https://gitcode.com/GitHub_Trending/ho/home-assistant.io …

2026/9/24 16:55:04 阅读更多 →
PaddleHub xception41_imagenet 图像分类模块实战指南:从安装预测到 Xception41 网络源码解析

PaddleHub xception41_imagenet 图像分类模块实战指南:从安装预测到 Xception41 网络源码解析

人工智能大模型微调模型推理服务 【免费下载链接】PaddleFormers PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers 点击查看 免费下载 本篇…

2026/9/24 16:54:03 阅读更多 →
Kornia 本地特征提取优化基准:基于 Oxford graf 数据集的 GPU/CPU/MPS 端到端加速与质量验证

Kornia 本地特征提取优化基准:基于 Oxford graf 数据集的 GPU/CPU/MPS 端到端加速与质量验证

计算机视觉人工智能深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/gh_mirrors/ko/kornia 点击查看 免费下载 本文基于 benchmarks/feature/graf_benchmark.md 记录的一…

2026/9/24 16:54:03 阅读更多 →

最新新闻

JSP+MySQL个人日记本源码运行全攻略:从环境搭建到避坑指南

JSP+MySQL个人日记本源码运行全攻略:从环境搭建到避坑指南

简介:基于jspmysql的JSP个人日记本源码,是一份面向Java Web初学者与课程设计场景的完整Web应用项目。资源以JSP作为视图层、Servlet处理控制逻辑,结合MySQL存储用户、日记与分类数据,覆盖用户登录、会话保持、日记增删改查、分类管…

2026/9/24 18:29:14 阅读更多 →
2026年AirPods全系选购指南:从AirPods 4到Pro与Max,哪款最适合你

2026年AirPods全系选购指南:从AirPods 4到Pro与Max,哪款最适合你

AirPods这个品类,现在真的有点“乱花渐欲迷人眼”了。从最初只有一款标准版,到如今AirPods 4、AirPods Pro、AirPods Max三条线并行,Plus版一般、Lite版传闻满天飞,哪怕是数码圈老手,真要下手买前不花点时间做功课&…

2026/9/24 18:29:14 阅读更多 →
结构可靠性分析:验算点法与直接抽样组合实战

结构可靠性分析:验算点法与直接抽样组合实战

简介:面向结构可靠性与安全度评估的实用算法压缩包,适合结构工程专业学生、科研人员及从事可靠性分析的工程师。资源聚焦验算点法和直接抽样法,同时涉及蒙特卡洛模拟思路,用于计算结构失效概率、评估极端荷载下的安全裕度&#xf…

2026/9/24 18:29:14 阅读更多 →
前后端分离部署实战:systemd托管Java进程+Nginx反向代理

前后端分离部署实战:systemd托管Java进程+Nginx反向代理

1. 部署方案设计与总体思路1.1 为什么是“systemd Nginx”这套组合前后端分离项目的部署,说简单也简单,说麻烦也麻烦。简单在于流程是固定的——后端打成 jar 包跑起来,前端构建出静态文件扔给 Web 服务器。麻烦在于每一个环节都有坑&#x…

2026/9/24 18:29:14 阅读更多 →
腾讯云EdgeOne免费CDN实战:接入配置与成本优化指南

腾讯云EdgeOne免费CDN实战:接入配置与成本优化指南

上个月帮一个朋友的博客站点排查访问慢的问题。他的服务器带宽只有5M,文章里全是高清截图和录屏素材,高峰期十几个人同时打开就卡得不行。我顺手看了眼他用的还是老式按量计费CDN,月底账单里光是流量费就占了一半。我说你这个站,流…

2026/9/24 18:29:14 阅读更多 →
Linux与Windows系统运维:参数查询与配置命令对照实战

Linux与Windows系统运维:参数查询与配置命令对照实战

很多时候,我们干的活儿并不是什么高深莫测的架构设计,反而是那些每天都在重复的“查一下参数、改一个配置”。尤其是当你的手头同时管着 Windows 服务器和 Linux 服务器时,这种“精神分裂”的感觉会特别明显:明明在 Windows 上用图…

2026/9/24 18:28:13 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →