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

我们如何在小黄瓜场景(SpecFlow/BDD/Selenium)中实现“给定”?,selenium,bdd,specflow,gherkin,Selenium,Bdd,Specflow,Gherkin,我们正在应用BDD并使用SpecFlow和Selenium。验收标准在小黄瓜中规定 我对给定的条款有一个问题 一个例子可能是 鉴于我在订单详情页面 当我提交订单时 然后我看到订单摘要 因此,对于“给定我在订单详细信息页面”,我们必须登录并准备好提交订单。但我们如何才能做到这一点呢 如果我们已经有了相关的现有SpecFlow步骤,我们可以通过Selenium使用这些步骤来达到正确的点-类似这样的 鉴于我是一名注册用户 我在登录页面上 我使用我注册的用户名和密码登录 我创建了一个新的订单 我搜索XY

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

我对给定的条款有一个问题

一个例子可能是

鉴于我在订单详情页面 当我提交订单时 然后我看到订单摘要 因此,对于“给定我在订单详细信息页面”,我们必须登录并准备好提交订单。但我们如何才能做到这一点呢

如果我们已经有了相关的现有SpecFlow步骤,我们可以通过Selenium使用这些步骤来达到正确的点-类似这样的

鉴于我是一名注册用户 我在登录页面上 我使用我注册的用户名和密码登录 我创建了一个新的订单 我搜索XYZ产品 我将产品添加到订单中 然后我选择订单详细信息页面 当我提交订单时 然后我看到订单摘要 我们甚至可以将所有这些步骤都放在步骤代码的“给定我在订单详细信息页面”下

然而,我们使用Selenium来实现给定的功能是否正确?或者我们应该找到一些方法来设置会话/数据库中的所有相关状态/数据,而不必通过UI

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


我希望Stack Overflow是一个合适的论坛,因为它不能帮助我们,但我认为它不是——如果是这样,请不要击倒我

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

[Given@Iam在订单详情页面上] 公共无效提供一个月的订单详细信息 { 我是注册用户; 在登录页面上显示AndI am; //诸如此类 }
我假设您正在执行集成测试,因此访问数据库是有意义的

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...
通过这种模式,“订单”页面上的“我是”复合体被分解为多个后台步骤,这些步骤设置了有效状态,功能文件现在可以引用该页面上的多个操作,而无需重复

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

避免使用我注册的用户名和密码登录,而是直接使用我已登录设置身份验证状态。同样地设置顺序-不要依赖您没有测试的生产代码,否则您的测试将在错误的情况下失败


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

谢谢-回答得好。我假设您正在执行集成测试,因此访问数据库是有意义的。是的,我们是。Selenium自动化了ui测试——我不会用它来设置数据,而且我觉得在正确的状态下构造记录更干净。我同意——这是正确的方法。这样做会有一定的开销,但它不会那么脆弱,并且允许在不要求先对这些其他步骤进行编码的情况下开发该功能。谢谢-是的,了解该功能,这是一种在步骤中很好地分组步骤的方法。哦,对不起,我必须更好地阅读问题。使用Selenium-我会说不。首先,它比直接使用db操作要花更多的时间。其次,如果在创建订单时出现问题,您将无法测试必要的功能。测试应该尽可能原子化,因此夹具/工厂是这种情况下的最佳选择。谢谢@p0deje。我同意这绝对是最好的办法。