我们如何在Gherkin场景(SpecFlow / BDD / Selenium)中实现'Given'?

时间:2012-02-14 12:28:23

标签: selenium bdd specflow gherkin

我们正在应用BDD并使用SpecFlow和Selenium。验收标准在Gherkin中规定。

我对Given条款有疑问。

一个例子可能是......

  • 鉴于我在订单详情页面
  • 当我提交订单时
  • 然后我看到订单摘要

因此,对于'鉴于我在订单详情页面',我们必须登录并准备好提交订单。但是我们如何达到这一点呢?

如果我们已经有相关的现有SpecFlow步骤,我们可以使用这些(通过Selenium)到达正确的位置 - 就像这样......

  • 鉴于我是注册用户
  • 我在登录页面
  • 我使用注册的用户名和密码登录
  • 我创建了一个新订单
  • 我搜索XYZ产品
  • 我将产品添加到订单
  • 我选择订单详情页面
  • 当我提交订单时
  • 然后我看到订单摘要

我们甚至可以将步骤代码中的所有步骤放在“鉴于我在订单详情页面上”

但是我们是否有权使用Selenium来实现Given?或者我们应该找到一些方法来设置会话/数据库中的所有相关状态/数据而不通过UI?

我怀疑这里没有对错。我不得不说它对我们来说非常好,但我们一直在寻求改进我们的方法。因此,非常有兴趣听取任何有实际经验的人的意见。

我希望Stack Overflow是正确的论坛(不禁认为不是 - 如果是这样,请不要让我失望!)...

2 个答案:

答案 0 :(得分:5)

您可以从步骤定义中调用其他步骤

[Given(@"I am on the order details page ")]
public void GivenIAmOnTheOrderDetailsPage()
{
     Given("I am a registered user");
     And("I am on the login page");
     // so on
}

答案 1 :(得分:4)

我假设您正在执行集成测试,因此访问数据库是有意义的。

Selenium自动化ui测试 - 我不会用它来设置你的数据,因为那时对ui的更改会破坏真正应该依赖于初始有效订单状态的测试。

执行代码可能需要执行某些步骤 - 例如登录...但它们实际上并不是您在此测试中测试的内容。您是否考虑过使用Background标签进行设置?

Feature: Order Details Page
As a customer ...
I want to ...
So that ...

Background: 
  #set up user authentication status
    Given I am logged in

  #set up order status to be consistent with this page
    And I have an order ready for submission

Scenario: I can submit my order
    ...etc...

Scenario: I can cancel my order
    ...etc...

使用这种模式复杂"我在订单页面"分为多个设置有效状态的后台步骤,现在功能文件可以引用该页面上的多个操作而不会重复。

我认为您为集成测试设置数据的方式取决于您。但我觉得在正确的状态下构建记录更清晰。

避免I log in using my registered username and password,而只是直接使用I am logged in设置身份验证状态。同样设置订单 - 不要依赖您未经过测试的生产代码,否则您的测试将在错误的情况下失败。

您可以重复使用给定的步骤 - 但它们不应该依赖于生产代码。