Bar*_*ney 7 ruby testing bdd module cucumber
我为我们的网络应用程序编写了一个模态幻灯片,它提供了一组文档导航,并为这些文档公开了各种元数据.
这是具有深奥要求的应用程序的一个重要组成部分,因此我认为其核心场景(作为验收标准给出)应该是众多且内部一致的,这是公平的.
为了避免为我们的许多场景中的每一个都采取新的步骤,我已经调整了一个帮助器,将人类可读的术语翻译document caption
成选择器:
module SelectorsHelper
def selector_for(term)
case term
# Lightbox / modal / fancybox
when 'lightbox'
'#fancybox-inner'
when 'close button'
'.document-viewer__tools__close'
Run Code Online (Sandbox Code Playgroud)
...以及一些通用的步骤定义,例如:
# Generic click action
When(/^I click (?:on )?(?:the |a )'(.*?)'?$/) do |element|
find(selector_for(element)).click
end
Run Code Online (Sandbox Code Playgroud)
问题是,我是否采用非常通用的概念,如上述或更具体的抽象涉及在一组特征中重复出现的模式,这些问题可能会对其他深奥的特征造成严重破坏,这些特征可能有更具体的解析步骤他们.我见过的每个Cucumber示例都有步骤定义文件,其文件名与特定的特征文件具有程序关系,我的假设是在这些情况下,只会调用该步骤定义文件来解析其相关功能中的场景:
+ features
| + step_definitions
| | + global_steps.rb
| | + modal_steps.rb
| | + login_steps.rb
| + modal.feature
| + login.feature
Run Code Online (Sandbox Code Playgroud)
但事实并非如此 - 而且我正在努力让自己屈服于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
Run Code Online (Sandbox Code Playgroud)
然后在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
Run Code Online (Sandbox Code Playgroud)
此功能 -
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"
Run Code Online (Sandbox Code Playgroud)
结果是这个输出 -
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
Run Code Online (Sandbox Code Playgroud)
我再次认为使用它是一个非常糟糕的主意。最好有一些易于遵循和调试的稍微重复的步骤定义,然后有一个超级通用的步骤定义来统治它们!
编辑 - 重新阅读您的问题和博客文章后,我认为这并不能真正回答您的问题。然而,我相当确定你正在尝试做一些非黄瓜的事情
归档时间: |
|
查看次数: |
936 次 |
最近记录: |