3

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

我对 Given 子句有疑问。

一个例子可能是...

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

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

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

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

我们甚至可以将所有这些步骤放在“鉴于我在订单详细信息页面”下的步骤代码中

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

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

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

4

2 回答 2

5

You can call other steps from step definition

[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
}
于 2012-02-14T13:24:30.143 回答
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 log in using my registered username and password而是直接使用I am logged in. 类似地设置订单 - 不要依赖您未测试的生产代码,否则您的测试将在错误的情况下失败。

您可以重复使用 Given 步骤 - 但它们不应依赖生产代码。

于 2012-02-14T13:34:49.277 回答