如何在Gherkin场景(SpecFlow/BDD/Selenium)中实现“Given”?

3
我们正在应用BDD,使用SpecFlow和Selenium。验收标准在Gherkin中指定。
我有一个关于Given子句的问题。
一个例子可能是...
假设我在订单详情页面上
当我提交订单时
然后我看到订单摘要
所以对于“假设我在订单详细信息页面上”,我们必须登录并准备好提交订单。但是我们如何达到这个目的?
如果我们已经有相关的现有SpecFlow步骤,我们可以使用这些步骤(通过Selenium)来达到正确的位置 - 类似于这样...
假设我是注册用户
而且我在登录页面上
而且我使用我的注册用户名和密码登录
而且我创建了一个新订单
而且我搜索XYZ产品
而且我将产品添加到订单中
而且我选择订单详细页面
当我提交订单时
然后我看到订单摘要
我们甚至可以将所有这些步骤放在“假设我在订单详细信息页面上”的步骤代码下。
但是,我们是否正确地使用Selenium来实现Given?还是应该找到一种方法在不通过UI的情况下设置会话/数据库中的所有相关状态/数据?
我怀疑这里没有对错之分。我必须说这对我们非常有效,但我们始终在寻求改进我们的方法。因此,非常希望听取有真实经验的任何人的意见。
我希望Stack Overflow是正确的论坛(不能帮助但认为它不是-如果是,请不要打倒我!)...
2个回答

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...

使用这种模式,复杂的“I am on the Orders Page”被分解成多个背景步骤以建立一个有效状态,这样特性文件就可以引用该页面上的多个操作而不会产生重复。
我认为如何设置集成测试数据取决于您。但是我觉得构建处于正确状态的记录更加清晰。
避免使用“我使用注册的用户名和密码进行登录”,而是直接使用“我已登录”来设置身份验证状态。同样地设置订单-不要依赖于您没有测试的生产代码,否则您的测试将在错误的情况下失败。
您可以重复使用给定步骤,但不应该依赖于生产代码。

谢谢,好的回答。 "我假设你正在进行集成测试,因此访问数据库是有意义的。" 是的,我们是这样做的。 "Selenium自动化UI测试-我不会用它来设置您的数据"和"我觉得构建正确状态的记录更加简洁。" 我同意-这是正确的方法。虽然这样做有一定的开销,但它会更容易维护,而且可以在不需要编写这些其他步骤的情况下开发功能。 - Mark Chidlow

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
}

谢谢-是的,我知道这个功能,它可以很好地在步骤中组织步骤。 - Mark Chidlow
哦,抱歉,我应该更好地阅读问题。使用Selenium - 我会说不。首先,它比直接操作数据库需要更多的时间。其次,如果出现问题,例如创建订单,您将无法测试必要的功能。测试应尽可能原子化,因此在这种情况下,固定装置/工厂是最佳选择。 - p0deje
谢谢 @p0deje。我同意这绝对是最好的方法。 - Mark Chidlow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接