Quick/Nimble 用于 Swift:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 Quick/Nimble,为什么需要它们?

\n\n

Quick 和 Nimble 是两种互补的 Swift 语言库,旨在以 行为驱动开发 (BDD) 风格编写测试。BDD 是一种开发方法论,关注从用户角度出发的应用程序行为,而非技术实现细节。与 XCTAssertEqual(a, b) 这类枯燥的断言不同,您可以描述应该发生什么:“当用户点击按钮时,应用程序应显示问候语”。

\n\n

Quick 是一个用于描述测试场景的框架。它提供了一种领域特定语言 (DSL),允许您以层次结构组织测试:describe(描述上下文)、context(细化条件)和 it(具体测试)。这使得测试即使对于非技术团队成员(如经理、分析师)也易于阅读和理解。

\n\n

Nimble 是一个用于编写匹配器(断言)的库。与标准的 XCTAssert 不同,您可以使用更具表现力的结构:expect(value).to(equal(expected))、expect(array).to(contain(element))。Nimble 提供了数十种内置匹配器,并允许您轻松创建自定义匹配器。

\n\n

为什么需要它们?

\n
    \n
  • 可读性: BDD 风格的测试看起来像规范。您可以将其展示给客户,确保需求被正确理解。
  • \n
  • 结构化: describe/context/it 层次结构有助于逻辑地组织测试,避免“意大利面条式代码”。
  • \n
  • 表达力强的匹配器: Nimble 使断言更加直观和信息丰富。测试中的错误会立即变得清晰。
  • \n
  • 调试便利性: 当测试失败时,您看到的不仅仅是“预期 5,实际得到 3”,而是完整的上下文:“当用户输入错误密码时,系统应显示错误”。
  • \n
\n\n

安装 Quick/Nimble

\n\n

Quick 和 Nimble 可以通过 CocoaPods 或 Swift Package Manager (SPM) 安装。我们将介绍这两种方法。

\n\n

通过 CocoaPods 安装

\n

如果您尚未使用 CocoaPods,请先安装它:

\n
sudo gem install cocoapods
\n

在项目根目录下创建一个 Podfile 文件,并添加以下内容:

\n
target 'YourAppName' do\n  # 常规依赖(如果有)\n  use_frameworks!\n\n  target 'YourAppNameTests' do\n    inherit! :search_paths\n    pod 'Quick'\n    pod 'Nimble'\n  end\nend
\n

然后执行:

\n
pod install
\n

之后,打开 .xcworkspace 文件。

\n\n

通过 Swift Package Manager (SPM) 安装

\n

在 Xcode 中:File → Add Packages... 并输入仓库 URL:

\n
https://github.com/Quick/Quick.git\nhttps://github.com/Quick/Nimble.git
\n

选择最新的稳定版本,并将包添加到您的测试目标(YourAppNameTests)。

\n\n

快速入门:第一个测试

\n

让我们创建一个简单的 Calculator 类并对其进行测试。

\n\n

待测试的类

\n
// Calculator.swift\nimport Foundation\n\nclass Calculator {\n    func add(_ a: Int, _ b: Int) -> Int {\n        return a + b\n    }\n\n    func subtract(_ a: Int, _ b: Int) -> Int {\n        return a - b\n    }\n\n    func multiply(_ a: Int, _ b: Int) -> Int {\n        return a * b\n    }\n}
\n\n

使用 Quick 和 Nimble 的测试

\n
// CalculatorSpec.swift\nimport Quick\nimport Nimble\n@testable import YourAppName // 替换为您的应用程序名称\n\nclass CalculatorSpec: QuickSpec {\n    override func spec() {\n        describe("Calculator") {\n            var calculator: Calc                    

推荐