在 Cucumber 中编写测试定义的正确语法是什么?
What Is the correct syntax for writing test definitions in Cucumber?
在 Cucumber 中编写步骤定义的实际语法是什么?我看到它以不同的方式编写。没有确定的语法吗?我知道锚点不是强制性的,但有基本规则吗?
我是 Cucumber 的新手,非常感谢能帮助我了解基础知识的婴儿步骤信息。谢谢大家!
我正打算向您指出在线文档,但我所知道的在线文档 (at cucumber.io and at relishapp.com) 实际上并没有很好地回答您的问题。 (不过,它确实包含许多示例,非常值得一读。)
在 Cucumber 的 Ruby 实现中,步骤定义文件是 features/step_definition
目录中的 .rb
个文件。它们包含对方法的一系列调用,每个方法都定义了 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
这些步骤练习了一个网络应用程序。它们尽可能简单,同时仍然实用。
一个 good 步骤定义应该在它的块中有一个单一的方法调用,例如
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
步骤定义所做的事情。
在 Cucumber 中编写步骤定义的实际语法是什么?我看到它以不同的方式编写。没有确定的语法吗?我知道锚点不是强制性的,但有基本规则吗?
我是 Cucumber 的新手,非常感谢能帮助我了解基础知识的婴儿步骤信息。谢谢大家!
我正打算向您指出在线文档,但我所知道的在线文档 (at cucumber.io and at relishapp.com) 实际上并没有很好地回答您的问题。 (不过,它确实包含许多示例,非常值得一读。)
在 Cucumber 的 Ruby 实现中,步骤定义文件是 features/step_definition
目录中的 .rb
个文件。它们包含对方法的一系列调用,每个方法都定义了 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
这些步骤练习了一个网络应用程序。它们尽可能简单,同时仍然实用。
一个 good 步骤定义应该在它的块中有一个单一的方法调用,例如
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
步骤定义所做的事情。