在Cucumber中编写步骤定义的实际语法是什么?我看到它是用不同的方式写的。有没有明确的语法?我知道锚点不是强制性的,但是有基本规则吗?
我是Cucumber的新手,并会欣赏宝贝步骤信息,以帮助我理解基础知识。谢谢你们!
答案 0 :(得分:1)
我打算将您指向在线文档,但我知道的关于(at cucumber.io和at relishapp.com)的在线文档并没有真正回答您的问题。 (它确实包含很多例子,非常值得一读。)
在Cucumber的Ruby实现中,步骤定义文件是.rb
目录中的features/step_definition
个文件。它们包含对方法的一系列调用,每个方法都定义了Gherkin步骤的实现。这是一个例子:
Given /^there is a user named "(.*)"$/ do |username|
# code that creates a user with the given username
end
有几种方法可以定义步骤:Given
,When
,Then
,And
和But
。它们都完全相同,您可以使用任何一个来定义任何步骤。最佳做法是使用最适合您定义的步骤(从不And
或But
)。
传递给步骤定义方法的参数是一个正则表达式,旨在匹配Gherkin .feature
文件中的一个或多个步骤。以上示例匹配以下步骤:
Given there is a user named "Ade Tester"
(" Ade Tester"可能是任何东西)。
当Cucumber执行正则表达式匹配的步骤时,将运行传递给步骤定义方法的块。它可以包含您喜欢的任何Ruby代码。
正则表达式中的匹配组(括在括号中)作为块参数传递给块。匹配组的数量必须与块参数的数量匹配,否则您将收到错误。一个常见的约定是将与引号中的字符串匹配的匹配组包含在内,以便在视觉上将它们与步骤的固定部分分开,如上所述,但这纯粹是约定,您可以选择不执行此操作。
默认情况下,正则表达式无需匹配整个步骤。如果您希望定义仅匹配整个步骤,则必须在正则表达式中强制执行该定义,就像我在上面的示例中使用^
和$
执行的那样。除非你有充分的理由不这样做,否则这样做。此步骤定义(不含$
)
Given /^there is a user named "(.*)"/ do |username|
create :user, username: username
end
会匹配
Given there is a user named "Ade Tester" on weekdays but "Dave Schweisguth" on weekends
这可能是一个坏主意。更糟糕的是,如果您有两个步骤的定义,Cucumber将无法确定使用哪个定义,并且您会收到错误。
在features / step_definitions / documentation.rb中:
When /^I go to the "([^"]+)" documentation$/ do |section|
path_part =
case section
when "Documentation"
"documentation"
else
raise "Unknown documentation section: #{section}"
end
visit "/documentation/#{path_part}/topics"
end
Then /^I should see the "([^"]+) documentation"$/ do |section|
expect(page).to have_css('h2.doctag_title a', text: section)
end
这些步骤可以运行Web应用程序。它们尽可能简单,但仍然实用。
答案 1 :(得分:0)
良好步骤定义应在其块中具有单个方法调用,例如
When "Frank logs in" do
login user: @frank
end
错误步骤定义在其块中包含大量代码,例如
When "I login as Frank" do
visit root_path
fill_in login_email, with:
# lots of other stuff about HOW to login
...
end
其他错误步骤定义使用了很多参数的非常复杂的正则表达式。
可怕的步骤定义调用其他步骤定义并执行bad
步骤定义所做的事情。