【问题标题】:Limit cucumber steps or steps file to specified feature or tag将黄瓜步骤或步骤文件限制为指定的功能或标签
【发布时间】:2013-07-31 14:50:57
【问题描述】:

我为我们的网络应用程序编写了一个模态幻灯片,它显示了一组文档的导航,并公开了这些文档的各种元数据。

这是应用程序的一个很大的组件,具有深奥的要求,所以我认为它的核心场景(作为验收标准给我)应该是众多但内部一致的。

为了避免在我们的许多场景中都有新的步骤,我调整了 a helper,它将诸如 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 似乎非常单薄,所以一方面我对无限的潜力感到畏惧,另一方面又没有预先确定的实现。有什么想法吗?

【问题讨论】:

    标签: ruby testing module cucumber bdd


    【解决方案1】:

    根据我的经验,过于通用的步骤会导致极其难以维护自动化代码库。如果可能,尽量在这里寻求平衡,只有你才能判断这种平衡在哪里。您不希望过度重复的步骤定义,但也不希望调试超级通用的噩梦。

    可以使用解决方法来获取标签列表,但请不要这样做。这很恶心,很奇怪,而不是黄瓜的用途。

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

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

    然后在step_definition body中检查你要检测的标签是否包含在列表中——

    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
    

    我再次认为使用它是一个非常糟糕的主意。最好使用易于遵循和调试的稍微重复的步骤定义,然后使用单个超级通用的步骤定义来管理所有步骤!

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

    【讨论】:

    • 我认为我的问题是寻找一个过于具体的解决方案来解决一个令人难以置信的普遍困境。这是一个我本可以期待的好问题。你的建议——不是黄瓜的用途——很有意义。如果我再次使用黄瓜,我会遵循这个建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多