5

我正在尝试编写多步骤业务流程的需求(通过向导)。我有很多场景,用户与一个屏幕的交互会改变是否允许您在另一个屏幕上选择选项。

例如(我掩盖了实际的业务,但步骤的过程和形式几乎相同):

Feature: Personal Diagnostic Search Filter
  In order to select a Technician who offers Personal Diagnostics,
    when I've asked for a Personal Diagnostic
  As a Business Customer
  I want to limit my search to Technicians who offer Personal Diagnostics

  Background:
    Given a Business named "Big Al's Auto Supply"
      And a Customer named "Bob Test" at the "Big Al's Auto Supply" Business
      And an Account named "bobtest@testbusiness.com" owned by "Bob Test"
      And the "bobtest@testbusiness.com" Account has the "Repair Order Creator"
        permission
      And you log in as "bobtest@testbusiness.com"
      And you start scheduling a new Repair Order

  Scenario: Enter the Select Technician page when Use PD is selected
    Given you select Use PD
    When you enter the Select Technician page
    Then the PD Filter should be visible
      And the PD Filter should be selected

  Scenario: Basic Search for Technicians when PD Filter is selected
    Given a Technician named "PD Technician"
      And the Technician named "PD Technician" supports PD
      And a Technician named "Non-PD Technician"
      And the Technician named "Non-PD Technician" does not support PD
      And you select Use PD
      And you enter the Select Technician page
      And you select the PD Filter
      And you select Basic Search
    When you search for Technicians with the name "Technician"
    Then your search results should contain "PD Technician"
      And your search results should not contain "Non-PD Technician"

但在Gherkin wiki上,建议您:

避免在给定的情况下谈论用户交互

不过,他们继续例外:

登录一个用户(无交互推荐的一个例外。“发生得更早”的事情是可以的)。

该页面上还说:

When 步骤的目的是描述用户执行的关键操作

如果您有很多 UI 交互,什么属于 Given,什么属于 When?

在我的第一个场景中,select Use PD需要 UI 交互,因为它是创建新维修订单的向导的一部分。然而,这是 PD 过滤器可见的前提条件,并且在用户进入 Select Technician 页面时触发。

第一种情况可能没有那么糟糕,但第二种情况会加剧问题。当您点击搜索时会触发搜索,但必须完成许多 UI 交互才能导航到该页面。其中一些交互也不能被掩盖,因为Use PD必须选择搜索过滤器才能出现。但这些 UI 交互并不是场景的关键操作

4

1 回答 1

9

作为一般规则,尽可能多地表达这个场景,就好像你正在谈论它一样,并尽可能多地排除不相关的信息。

例如,我希望您在上面的场景中阅读如下内容:

Given our customer Bob Test is scheduling a repair order
And we have two technicians: "Fred Technician" and "George Nontechnician"
When Bob Test decides he wants a Personal Diagnostic
And he selects a technician
Then the search results should only contain "Fred Technician"

然后做任何必要的事情来使这些步骤起作用——无论是登录还是其他方式。请注意,我没有谈论“页面”,也没有采取实际步骤——它们对用户来说应该是直观的。BDD 与测试无关。它是关于提出人们将如何使用该系统的示例,以便您可以围绕这些示例进行对话并探索它们,找到异常和不同的场景等。

检查过滤器是否可见是没有价值的。用户并不关心过滤器是否可见。他关心他可以使用过滤器来获得他的结果,所以就这样做。

在代码中,我通常在我的步骤之间传递一个“世界”对象。这可以让很多笨蛋摆脱困境。我没有太多使用 Gherkin,但我想它提供了类似的能力。您可以在其中存储所有用户详细信息,您创建了哪些技术人员,以便您可以检查它不会在结果中带回“George Nontechnician”等。

为角色使用友好的名称也很有用,因为人们可以想象 Fred 和 George 的样子。

摆脱任何不会对场景产生影响并且不会帮助人们想象它发生的事情。您知道 Bob 有权安排订单,因为这就是他正在做的事情 - 只需在该步骤中添加必要的东西。

“何时”是您有兴趣描述的行为。在这种情况下,您对过滤个人诊断的能力感兴趣,因此与行为相关的所有用户交互都应该在“When”中,而所有之前的交互都应该在“Givens”中。我发现尝试考虑结果不同的情况很有用 - 例如,如果没有可用的 PD 技术人员会发生什么?这告诉我有什么区别;我们将设置不同的上下文,但执行相同的事件。上下文进入给定,事件进入何时。(这在引入“背景”之前要简单得多)。

一般来说,如果你在看一个场景时眼睛呆滞,那你就做错了。

希望这可以帮助。

于 2012-03-01T12:58:02.870 回答