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

Mar*_*low 3 bdd selenium specflow gherkin

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

我对Given子句有疑问.

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

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

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

如果我们已经有相关的现有SpecFlow步骤,我们可以使用这些(通过Selenium)来找到正确的点 - 这样的事情......

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

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

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

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

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

p0d*_*eje 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
}
Run Code Online (Sandbox Code Playgroud)


per*_*ist 5

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

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

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

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...
Run Code Online (Sandbox Code Playgroud)

通过这种模式,复杂的“我在订单页面”被分解为多个设置有效状态的后台步骤,并且功能文件现在可以引用该页面上的多个操作而无需重复。

我认为如何为集成测试设置数据取决于您。但我觉得以正确的状态构建记录会更干净。

避免I log in using my registered username and password直接使用 来设置身份验证状态I am logged in。类似地设置顺序 - 不要依赖您未测试的生产代码,否则您的测试将在错误的情况下失败。

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