黄瓜特征和步骤定义

时间:2011-08-03 10:50:04

标签: ruby cucumber gherkin

我是Cucumber测试的新手。

我创建了两个功能文件:

events.feature
partner.feature

将步骤定义放在step_definitions文件夹中:

./step_definitions/
     events.rb
     partner.rb

Cucumber似乎在所有.rb文件中查找步骤信息。

是否有限制功能来查看特定的步骤定义文件?

我想要这样做的原因是因为即使我使用--guess标志,我也会遇到不明确的匹配错误。

我想要这样做的原因是由于以下原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。

events.feature

Feature: Add partner
  As an administrator I can add a new partner

  Scenario: Create partner
    Given I am logged in
    When I create a partner
    Then I should see content

partner.feature

Feature: Add event
  As an administrator I can add a new event

  Scenario: Create event
    Given I am logged in
    When I create an event
    Then I should see content

只关注'然后我应该看到内容',这两种情况都会发生错误,因为在.rb文件中我需要包含:

partners.rb

Then /^I should see content$/ do
  BROWSER.html.should include('SOME PARTNER CONTENT')
end

events.rb

Then /^I should see content$/ do
  BROWSER.html.should include('SOME EVENT CONTENT')
end

这意味着存在“我应该看到内容”的模糊匹配。

我知道有不同的结构方式,即我可以创建内容功能,并使用场景大纲:

Feature: Add content
  As an administrator I can add a new content

  Scenario Outline: Create content
    Given I am logged in
    When I create an <content type>
    Then I should see <example content>

    Examples: 
    |event   |March Event | 
    |partner |Joe Blogs   | 

但我不想这样做,因为我想将每种内容类型封装在他们自己的测试功能中。

基本上我需要根据我正在测试的功能来研究如何运行特定的步骤文件。

3 个答案:

答案 0 :(得分:9)

Cucumber总是加载所有文件,我认为没有办法覆盖这种行为。关于模糊步骤的问题 - 解决方案很简单 - 在步骤中添加参数

Then /^(?:|I )should see "([^"]*)"$/ do |text|
  page.should have_content(text)
end

在场景中,只需将其称为

然后我应该看到“伙伴内容”

  • 免费奖金 - 您的情景现在更具可读性

答案 1 :(得分:1)

我认为您建议的替代方法没有任何问题。将步骤定义分离为逻辑域是有意义的。但是,似乎你可能试图把它放得太远,这将导致大量重复的代码和问题,就像你现在看到的模糊匹配一样。我建议做这样的事情:

Feature: Add partner
  As an administrator I can add a new partner

  Scenario: Create partner
    Given I am logged in
    When I create a partner
    Then I should see "partner content"

同样,在您的活动专题中:

...
Then I should see "event content"

然后您可以在单独的step_definitions/common_steps.rb文件中添加以下内容:

Then /I should see "(.*)"$/ do |content|
   BROWSER.html.should include(content)
end

此步骤没有任何关于它的合作伙伴/事件。相反,方案包含功能的特定于数据的字符串。

如果您正在使用Rails应用程序,cucumber-rails gem实际上会为您创建一系列常见的Web应用程序测试步骤。即使您不使用Rails,查看其中一些steps可能也很有用。

答案 2 :(得分:0)

我一直在寻找这个,但似乎不可能“开箱即用”。

我的解决方案是使用某种其他描述来区分步骤,例如类名,例如:

Scenario: Buildings List
    Given I have a Building with code "B1"
    And I have a Building with code "B2"
    When I go to the list of buildings
    Then I should see "B1" building code
    And I should see "B2" building code

这些“建筑代码”描述是您无需重复使用不同文件/域之间的步骤。