将黄瓜步骤或步骤文件限制为指定的功能或标记

我为我们的Web应用程序编写了一个模式幻灯片,其中显示了一组文档的导航并为这些文档提供了各种元数据。

这是具有深奥要求的应用程序中的一个重要组成部分,所以我认为它的核心场景(作为接受标准给出的)应该既众多又内部一致,这很公平。

为了避免为我们的许多场景采取新的步骤,我已经调整了一个帮助器,它将人类可读的术语(如document caption转换为选择器:

module SelectorsHelper
  def selector_for(term)
    case term
    # Lightbox / modal / fancybox
    when 'lightbox'
        '#fancybox-inner'
    when 'close button'
        '.document-viewer__tools__close'

...以及以下几个通用步骤定义:

# Generic click action
When(/^I click (?:on )?(?:the |a )'(.*?)'?$/) do |element|
  find(selector_for(element)).click
end

这个问题,无论我采用的是非常普遍的概念,还是涉及上述或更多具体抽象概念,涉及一系列特征中重复出现的模式,这些可能会对其他深奥特征造成严重破坏,这些特征可能会有更具体的步骤来解析他们。 我见过的每个Cucumber示例都具有步骤定义文件,其文件名与特定功能文件具有程序关系,我的假设是,在这些情况下,只会调用该步骤定义文件来解析其相关功能中的场景:

+ features
| + step_definitions
| | + global_steps.rb
| | + modal_steps.rb
| | + login_steps.rb
| + modal.feature
| + login.feature

但情况并非如此 - 我正在努力让自己屈服于Cucumber尝试将每一步定义模式应用于每种场景的想法。 如果这些测试将有任何优点,它们将会变得更多,引入新的概念,并保持相关性,而不需要连续重写。 我希望能够限制我的步骤范围,以阻止它们干扰未写入的功能,但不知道如何。 想到以下概念性解决方案:

  • 使用背景或场景@tags并仅为具有这些标签的场景调用步骤
  • 将步骤定义嵌套在某种包装助手或元步定义中,这是由所给出的错误背景调用的
  • 我对Ruby不熟悉,Cucumber看起来非常薄,所以我一方面受到无限潜力的困扰,另一方面没有预先确定的实现。 有任何想法吗?


    根据我的经验,过于普通的步骤导致极难维护自动化代码库。 尽可能在这里寻求平衡,只有你可以判断这个平衡点在哪里。 你不需要过分重复的步骤定义,但你不想要一个超级通用的恶梦来调试。

    可以使用解决方法来获取标签列表,但请不要这样做。 这很粗俗,很奇怪,而不是打算如何使用黄瓜。

    作为step_definitions的解决方法,您可以使用around步骤从场景中获取标签名称列表 -

    Around do |scenario, block|
      begin
        @tag_names = scenario.tags.collect { |tag| tag.name }
        block.call
      ensure
        $tags = nil
      end
    end
    

    然后在step_definition主体中检查你想检测的标签是否包含在列表中 -

    Given(/^I am testing a step with a "([^"]*)"$/) do |arg|
      if @tag_names.include?('@a_tag')
        puts 'Executing a step definition with tag - @a_tag'
      else
        puts 'Executing a step definition without tag - @a_tag'
      end
    end
    

    此功能 -

    Feature: Example feature
    
      @a_tag
      Scenario: Example scenario #1
        Given I am testing a step with a "value"
    
      Scenario: Example scenario #1
        Given I am testing a step with a "value"
    

    结果在这个输出 -

    Feature: Example feature
    
      @a_tag
      Scenario: Example scenario #1              # features/example.feature:4
        Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10
          Executing a step definition with tag - @a_tag
    
      Scenario: Example scenario #1              # features/example.feature:7
        Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10
          Executing a step definition without tag - @a_tag
    
    2 scenarios (2 passed)
    2 steps (2 passed)
    0m0.004s
    

    我再次认为使用这是一个非常糟糕的主意。 最好稍微重复步骤定义,易于跟踪和调试,然后有一个超级通用步骤定义来统一它们!

    编辑 - 重新阅读您的问题和博客文章后,我不认为这真的回答你的问题。 但是,我相当肯定你正在尝试做一些非黄瓜的东西

    链接地址: http://www.djcxy.com/p/73115.html

    上一篇: Limit cucumber steps or steps file to specified feature or tag

    下一篇: HttpClient PostAsync Invalid Post Format