我们如何在小黄瓜场景中实现"给定"(SpecFlow/BDD/Selenium)?



我们正在应用BDD并使用SpecFlow和Selenium。《小黄瓜》中规定了验收标准。

我有一个关于Given条款的问题。

一个例子可能是…

  • 如果我在订单详细信息页面
  • 当我提交订单时
  • 然后我看到订单摘要

因此,对于"Given I are on the order details page",我们必须登录并准备好提交订单。但是我们该如何做到这一点呢?

如果我们已经有了相关的现有SpecFlow步骤,我们可以使用这些步骤(通过Selenium)来达到正确的目的——比如。。。

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

我们甚至可以将所有这些步骤放在步骤代码中的"Given I are on the order details page"下

然而,我们使用Selenium来实现Given是正确的吗?还是我们应该找到一些方法来设置会话/数据库中的所有相关状态/数据,而不需要经过UI?

我怀疑这里没有对错之分。我不得不说,这对我们来说非常有效,但我们一直在寻求改进我们的方法。所以我很想听听任何有实际经验的人的意见。

我希望Stack Overflow是一个合适的论坛(忍不住认为它不是——如果是这样,请不要击落我!)。。。

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

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设置身份验证状态。类似地设置订单-不要依赖于您没有测试的生产代码,否则您的测试将在错误的情况下失败。

您可以重用Given步骤,但它们不应该依赖于生产代码。

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

[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
}

最新更新