gpt4 book ai didi

ruby - 将 cucumber 步骤或步骤文件限制为指定的功能或标签

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:15 24 4
gpt4 key购买 nike

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

这是一个具有深奥需求的应用程序的大型组件,因此我认为它的核心场景(作为验收标准提供给我)应该既多又内部一致是很公平的。

为了避免对我们的许多场景中的每一个都有一个新的步骤,我已经改编了 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 试图将每个 步骤定义模式应用到每个 场景的想法。如果这些测试有任何值(value),它们将变得越来越多,引入新概念,并保持相关性而无需不断重写。我希望能够限制我的步骤的范围,以阻止它们干扰它们不是为其编写的功能,但不知道如何。我想到了以下概念性解决方案:

  • 使用背景或场景 @tags 并仅针对具有这些标签的场景调用步骤
  • 在某种包装助手或元步骤定义中嵌套步骤定义,这些定义由给定的错误背景调用

我对 Ruby 不熟悉,Cucumber 似乎非常单薄,所以我一方面被无限的潜力吓倒,另一方面又没有预先确定的实现。有什么想法吗?

最佳答案

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

可以使用变通方法获取标签列表,但请不要这样做。这很恶心,很奇怪,而且不是 cucumber 的用途。

作为 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

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

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

关于ruby - 将 cucumber 步骤或步骤文件限制为指定的功能或标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17973734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com