在 Cucumber 中编写测试定义的正确语法是啥?

Posted

技术标签:

【中文标题】在 Cucumber 中编写测试定义的正确语法是啥?【英文标题】:What Is the correct syntax for writing test definitions in Cucumber?在 Cucumber 中编写测试定义的正确语法是什么? 【发布时间】:2016-07-06 07:39:39 【问题描述】:

在 Cucumber 中编写步骤定义的实际语法是什么?我看到它以不同的方式编写。没有明确的语法吗?我知道锚点不是强制性的,但有基本规则吗?

我是 Cucumber 的新手,我会很感激能帮助我了解基本知识的婴儿步骤信息。谢谢大家!

【问题讨论】:

我们是在讨论什么应该是您的功能文件(Gherkin)或 ruby​​ 中的实际实现的一部分? 感谢 homaxto。我说的是实际的实现,代码块,尤其是在“do”.....和“end”之间。那里有什么?会是什么吗? 在实现中,为了做必要的事情,需要做任何事情。在您的情况下,它将是 Ruby 代码,因此您仅受 Ruby 其语法和代码风格的限制。 嗨阿德测试员!这些答案对您有帮助吗?如果是这样,请接受和/或投票,或评论说为什么他们不是。更多信息:***.com/help/someone-answers 【参考方案1】:

我本来打算向您介绍在线文档,但我所知道的在线文档(at cucumber.io 和 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

定义步骤的方法有多种:GivenWhenThenAndBut。它们都做完全相同的事情,您可以使用任何一个来定义任何步骤。最佳做法是使用最适合您定义的步骤的那个(不要使用AndBut)。

传递给步骤定义方法的参数是一个正则表达式,用于匹配 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 应用程序。它们尽可能简单,同时仍然实用。

【讨论】:

或者,换句话说:语法就是Ruby。【参考方案2】:

good 步骤定义应在其块中包含单个方法调用,例如

When "Frank logs in" do
  login user: @frank
end

Bad 步骤定义在其块中包含大量代码,例如

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 中编写测试定义的正确语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

我在Eclipse中使用Java建立了一个简单的自动化框架,但是无法通过Junit运行Cucumber测试

Cucumber测试驱动开发

使用 Cucumber / Selenium 测试 CSS 计数器

行为驱动:Cucumber + Selenium + Java - 实现测试用例的参数化

如何在cypress Cucumber中编写Given,When,Then等可以使用的通用步骤定义

每次测试运行时编写带有唯一数据的 Cucumber 特征文件