【问题标题】:Can a cucumber feature file 'inherit' from a parent feature file?黄瓜功能文件可以从父功能文件“继承”吗?
【发布时间】:2017-01-30 19:55:48
【问题描述】:

我的项目有多个功能文件,其中不同的功能仍然共享相同的背景设置。目前,这些备份步骤跨功能文件复制;如果我可以将这些常见步骤放在单个功能中,这将允许指定一次步骤,并在“子”功能文件的开头指定它们,并基本上停止跨功能重复后台步骤的繁琐。

从我的搜索中,我发现了对“步骤”定义的引用 - 我可能对此解释有误,但不是这样:

steps %{
    When I go to the search form
    And I fill in "Query" with "#{query}"
    And I press "Search"
  }
end

只需复制步骤定义,这意味着我的功能看起来与它们刚才的方式几乎相同(除了添加了“步骤 %{ ...}end”)?

或者我正在寻找的东西是不可能的?

【问题讨论】:

  • 或者这是我的愿望的丧钟:stackoverflow.com/questions/23832979/…
  • 您提到的是嵌套步骤...您只需在功能文件中编写一个步骤而不是多个步骤,因此继承部分未实现。很多人建议不要使用这种方法。在这些步骤中使用带有标签过滤器的 Before 全局钩子怎么样,但如果这些对于场景的工作方式是不可或缺的,那将是不可取的,因为您会在代码中隐藏关键步骤。

标签: inheritance cucumber


【解决方案1】:

简短的回答,不。功能文件不能从另一个功能文件继承。

更长的答案是,如果您希望在许多不同的执行中进行通用设置,请考虑将设置隐藏在您的步骤委托给的帮助程序类中。在许多情况下,一个步骤的实现是对另一个实际执行工作的对象的委托。许多步骤只有一行。有些更长,但很少超过两三个。

一个常见的背景是登录系统。登录很重要,但它通常可以隐藏在步骤中。利益相关者通常不关心这样的事情。他们倾向于关心商业行为。因此,重复登录之类的事情对他们来说通常只是噪音,可以安全地隐藏在抽象中。

我的方法是将常见的东西(可能是重复的)隐藏在堆栈中。将其隐藏在步骤实现中的某个位置。

您的情况可能不同。

【讨论】:

  • 感谢您的回答。我认为我需要跨功能复制背景,因为涉及到许多设置步骤才能使我达到“共同”点,从该点开始分叉到不同的场景中。将这些步骤隐藏在帮助程序类中可能是可能的,但它存在两个困难:1)设置步骤变得模糊(并且它们不是微不足道的步骤),以及 2)在这些步骤之间传递参数列表和映射成为显着的开销涉及的 20 多个步骤
【解决方案2】:

功能文件不能继承。您不应该尝试使用功能文件进行任何编程!

这样做的方法是

  1. 说出你的共同背景是做什么的。
  2. 使用该名称实现辅助方法
  3. 在您的功能中包含引用该名称的内容
  4. 当您需要额外设置时,查找新名称、创建新方法并让它们通过调用使用现有方法

命名部分对功能很重要。其余的是编程,在功能中没有位置。

让我们做登录示例,假设我们已经具备注册用户和登录的功能

Scenario: Users can see their previous orders
  Given I am signed in
  When I view my orders
  Then I should see my orders

# steps
Given 'I am signed in' do
  sign_in user: @i
end

# Helper methods
module SignInStepHelper
  def sign_in(user:)
    register(user)
    ...
  end
end
World SignInStepHelper

现在您可以将此模式应用到任何复杂程度,因为一旦您进入堆栈的模块部分,您就是在使用一种编程语言,在这里您可以将任何复杂程度编程到单个方法调用中。

秘诀在于将“如何”向下推,使其低于步骤定义。将此与命名相结合,您可以处理任何级别的复杂性。

例如,让我们处理重复订购每月文具的注册客户

Scenario: Repeat order of monthly stationery

Given I am registered
And I have a monthly stationery order
When I repeat my monthly order
Then I should see my order in the checkout
And I should see my previous orders

# some steps
Given 'I have a monthly stationery order' do
  create_monthly_order(
    products: stationery_order,
    user: @i
  )
end

# implementation
module OrdersStepHelper
  def create_monthly_order(products:, user:)
    ...
  end

  def stationery_products
   [
     ...
  end
end

现在显然需要更多的代码来完成这项工作,但因为这被推到步骤定义之下,所以这只是简单的编程。因此,您将需要 stationery_orderadd_stock 等方法。但是,如果您在实现此行为时正在执行 BDD,那么您将完成大部分其他工作并可供您使用。

当我做cuking时,我有一个层次结构

features
step definitions
step helpers
application

堆栈越往下,我能推送的代码就越好,我的体验就会越好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多