CucumberSwift
CucumberSwift 是一款为 Swift 定制的 Cucumber 库,旨在解决当前 iOS Cucumber 实现中的问题。其目标是使安装变得简单,使用也变得容易,因此请随时提供反馈。
安装
CocoaPods
将此行添加到您的 Podfile 中
pod 'CucumberSwift'
XCode
安装 CucumberSwift 之后,打开您的测试目标的 info.plist 文件。您需要将 Principal Class
设置为 CucumberSwift.Cucumber
。如果您从源编辑 plists,它应该看起来像这样:
<key>NSPrincipalClass</key>
<string>CucumberSwift.Cucumber</string>
我该怎样使用它?
CucumberSwift 设计为与 XCTest 一起运行。要开始实现一些步骤定义,请通过扩展 Cucumber 并使用 StepImplementation 协议来实现。
import Foundation
import XCTest
import CucumberSwift
extension Cucumber: StepImplementation {
public func setupSteps() {
//Step definitions
Given("Something (matches|matched)") { (matches, _) in
//assuming match is "Something matched"
print(matches[0]) //Something matched
print(matches[1]) //matched
}
When("Something (matches|matched)") { (matches, _) in
//assuming match is "Something matched"
print(matches[0]) //Something matched
print(matches[1]) //matched
}
Then("Something (matches|matched)") { (matches, _) in
//assuming match is "Something matched"
print(matches[0]) //Something matched
print(matches[1]) //matched
}
And("Something (matches|matched)") { (matches, _) in
//assuming match is "Something matched"
print(matches[0]) //Something matched
print(matches[1]) //matched
}
But("Something (matches|matched)") { (matches, _) in
//assuming match is "Something matched"
print(matches[0]) //Something matched
print(matches[1]) //matched
}
MatchAll("Something (matches|matched)") { (matches, _) in
//assuming match is "Something matched"
print(matches[0]) //Something matched
print(matches[1]) //matched
}
}
}
生成的步骤存根
编写正则表达式可能很痛苦,而不是让您查找所有内容,CucumberSwift 将通过生成用于步骤定义的存根的 Swift 代码来帮助您。
钩子
CucumberSwift 包含 6 个钩子,分别是 Before/After Feature、Before/After Scenario 和 Before/After step,使用方法如下:
import Foundation
import XCTest
import CucumberSwift
extension Cucumber: StepImplementation {
public func setupSteps() {
BeforeFeature { feature in
}
AfterFeature { feature in
}
BeforeScenario { scenario in
}
AfterScenario { scenario in
}
BeforeStep { step in
}
AfterStep = { step in
}
}
}
标签
您可以使用环境变量 CUCUMBER_TAGS
指定要运行哪些标签。您可以通过前往编辑方案 -> 测试 -> 环境变量来设置它。传递要运行的逗号分隔的标签列表。
数据表
数据表分为两种类别,其中一种是场景轮廓中的数据表。
示例
示例让 Gherkin 处理数据,创建单独的场景来遍历表并注入值。
Feature: Some terse yet descriptive text of what is desired
Background:
Given I am logged in
Scenario Outline: <user> logs in # 1st: Dave, 2nd: Bob
Given a user named <user> # 1st: Dave, 2nd: Bob
And a password <password> # 1st: hello, 2nd: *%&#*#!!
When <user> logs in # 1st: Dave, 2nd: Bob
Then <user> sees <account balance> # 1st: $0, 2nd: $20,000
Examples:
| user | password | account balance |
| Dave | hello | $0 |
| Bob | *%&#*#!! | $20,000 |
测试数据
测试数据可以附加到步骤中,并将其交给步骤实现来处理。
Feature: Some terse yet descriptive text of what is desired
Scenario: minimalistic
Given a simple data table
| foo | bar |
| boz | boo |
可以通过 CucumberSwift 的步骤对象的可选 dataTable 属性访问它。
import Foundation
import XCTest
import CucumberSwift
extension Cucumber: StepImplementation {
public func setupSteps() {
Given("^a simple data table$") { (_, step) in
let dt = step.dataTable!
let row = dt.rows[0]
print(row[0]) //foo
print(row[1]) //bar
}
}
}
仍有哪些缺陷?
- Gherkin 语言错误
- 规则
- 文档字符串
- AND 对标签的支持(目前当传递多个标签时,被视为 OR)