
测试开发工具【免费下载链接】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),仅供参考