CucumberSwiftBeta 0.0.7

CucumberSwiftBeta 0.0.7

Tyler Thompson 维护。



  • 作者
  • Tyler Thompson

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>

image

我该怎样使用它?

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 代码来帮助您。

image

钩子

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)