【问题标题】:How do describe a simple process in Gherkin-style? [closed]如何用 Gherkin 风格描述一个简单的过程? [关闭]
【发布时间】:2014-11-11 14:24:54
【问题描述】:

假设我正在设计一些 SaaS 服务。我需要有一个允许用户创建网站的功能。用户可以在管理面板中对每个站点进行特殊设置(例如小部件的设计),并获得唯一的代码以将服务安装到自己的站点。

用户故事可能是:

作为登录用户,我想在管理面板中添加新站点,以便我可以单独配置小部件的每个实例,并且可以获得用于将小部件安装到我自己的站点的唯一代码。

表格

但如果我尝试用 BDD 或 GWT(Given When Then)或 Gherkin 风格来描述这个功能,我会遇到一些麻烦。我从下一个描述开始:

鉴于我已登录管理面板 而且我在“网站”页面上

当我点击“添加网站”按钮时

然后弹出“添加站点”窗口

正如您在上面的实现中看到的,假设站点添加将在弹出窗口中(例如,它对 UX 非常重要)。弹出窗口包含站点 URL 输入字段、带有语言的下拉控件以及“添加”和“取消”按钮。

我们遇到了一个奇怪的场景,它只负责弹出窗口。这是正确的吗?我该如何命名这个场景(“添加网站的表单打开”??)?此外,这种情况只有一种情况(当我单击 - 弹出窗口打开时)。也许根本不需要这种情况?我很困惑...

在这种情况下,我们需要在描述时创建另一个场景:

打开“添加站点”弹出表单

当我填写“站点 URL”字段时 并点击“添加”按钮

THEN 新站点将在系统中创建 并且我将转移到我自己网站的列表中

您觉得如何,我需要在哪里应用业务规则,例如: 1) 创建新站点时,必须生成一个唯一代码,该代码至少包含 8 个字符,包括数字和字母符号。 2) 检查不适用于站点 URL 输入字段,用户可以输入西里尔符号 3) 等等?

我还有很多问题希望得到社区的帮助!

【问题讨论】:

    标签: bdd agile scrum gherkin user-stories


    【解决方案1】:

    BDD 的作用是尽可能远离实现细节。这个场景有多个实现细节:

    GIVEN I'm logged into admin panel AND I'm on "Sites" page
    WHEN I click "Add site" button
    THEN Pop-up window "Add site" come up
    
    • 如果“站点”页面变为“Awesome Site”页面或被简单删除会怎样?
    • 如果“添加网站”不再是一个按钮会怎样?
    • 如果不是弹出窗口而是发生重定向会发生什么
    • 之后会发生什么?价值仅仅是显示弹出窗口吗?我猜不是……

    对于这个具体的例子,更好的方法是:

    GIVEN I'm an authorised administrator
    WHEN I enter all the required information for a new site and save it
    THEN I should see that site in my own sites list
    

    在这种情况下,如果您的实现发生变化,您只需更改步骤定义,而不必更改小黄瓜。不要忘记这些测试应该解释系统的行为,而不是它的实现方式。

    我认为您的其他问题与单元测试更相关:

    1. 创建新站点时,必须生成唯一代码,并且 由至少 8 个字符组成,包括数字和字母 符号 => 我会在课堂上做,小黄瓜不会 适当的,除非客户特别要求,然后 条件是“那么具有所需特征的代码是 为该站点生成”,您必须定义“必需 特征”在客户可以阅读和理解的词汇表中。

    2. 检查不适用于站点 URL 输入字段,用户可以再次输入西里尔符号 =>,将其置于与 1 相同的类级别。除非客户希望能够阅读某些内容关于它,它应该在单元级别。

    我希望这能回答你的问题。如果您想更好地了解如何编写更好的小黄瓜功能,我推荐 Dan North 的this article

    编辑 2014 年 11 月 13 日

    根据您的 cmets,我建议我们退后一步,描述一种处理您的案例要求的方法。我必须告诉你,我不是 BDD 专家,只是分享我自己的个人经验,有关该主题的更多信息,我建议你与 BDD KickstartCucumber.pro 背后的人联系,你可以在网上找到BDD 课程。他们将能够为您提供大量信息和书籍供您阅读。

    话虽如此,让我们进入主题。

    您得到的第一件事是功能或故事的列表,如果您按照 Mike Cohn 的故事模板,这些功能或故事将如下所示:

    As a <type of user> I want <to do something> in order to <serve a business purpose>
    

    我个人喜欢将业务目的放在首位,以确保我们不会在讨论中跳过它。您也可能不遵循该模板,这很好,但请记住,确保您向客户列出的功能具有商业目的是个好主意。如果一个功能背后没有商业价值,那么做它的意义何在......

    所以你确实有一个如上所述的功能/故事列表。现在对于这些功能中的每一个,都有不同的案例或场景,这就是 Dan 在 his article 中描述的内容。这就是 Given-When-Then 的介绍。

    Scenario: Title
    Given <some context>
    When <there is an event>
    Then <something happens>
    

    这些场景中的每一个都是有关此特定功能在不同上下文中如何表现的示例。它们是特定功能的不同验收标准,客户将其描述为系统的预期行为。他们应该不知道任何实现细节。像这样的东西:

    Given I am on page "First page"
    When I click "Hello world"
    Then I should see "You clicked hello world"
    

    由于在此编辑之前描述的原因而出错。

    让我们假设以下特征:

    In order to save time when answering clients requests, as a webmaster, 
    I want to be able to manage the list of websites I am responsible for
    

    这个故事的场景是:

    Scenario 1: Show a list of websites
    GIVEN I am an authorised administrator
    AND I am managing several websites
    THEN I should see a list of all the sites I manage
    
    Scenario 2: Add website to list
    GIVEN I am an authorised administrator
    WHEN I enter all the required information for a new site and save it
    THEN I should see that site in my own sites list
    
    Scenario 3: Edit website from list
    GIVEN I am an authorised administrator
    WHEN I edit the site informations
    THEN I the changes should be visible in my sites list
    
    ...
    

    现在,如果您想进行数据验证,例如“网站应该有标题”,该怎么办。对我来说,有两种不同的方法可以解决这个问题。您可以从用户的角度使用全栈测试来测试它,或者测试在对象级别是否存在一些验证。

    让我们假设以下场景:

    Scenario: New site has no title
    GIVEN I'm an authorised administrator
    WHEN I forget to fill in the title for a new site and save it
    THEN I should be warned the site is not valid
    

    您可以使用 cucumber 或 specflow 从 UX 运行此场景,因此使用某种基于浏览的代理来测试您的应用程序。这通常很慢,因为它会影响整个系统并模拟真实用户。这是一个选择,但我认为这不是最好的。 IMO 并非所有测试都应该针对 UX 运行,并且拥有太多 Gherkin 功能可能很难维护,这就是为什么我更喜欢专注于让快乐或关键路径(通常我问自己,钱从哪里来)测试完整-stack 并将其余的放在较低的级别。

    如果您愿意,您仍然可以将 Gherkin 用于这些单元测试。但这不是强制性的。您只需要一种方式向您的客户展示您实际上已经对所有这些特定格式控制和验证检查进行了测试。

    这并不意味着您不再使用 BDD,如果您是 ruby​​ist 或您使用的任何其他测试框架,您仍然可以在 rspec 中使用 given-when-then-should 模式。

    希望澄清这一切,如果有任何令人困惑的部分,请告诉我......

    【讨论】:

    • 感谢马克的回答!我非常感谢您的解释,并且您刚刚理解了我混乱的问题。
    • 但我还有下一个问题:1) 我知道我需要有一个行为级别来描述功能的行为。在其他层(我们将其命名为“实现”层),我们描述了此时必要的实现。但是我没有在 Scrum 中找到像实现层这样的必要工件(也许你知道文章或其他解释的来源吗?
    • 2) 我如何向开发团队提出当前的需求(例如:用户在创建新站点时需要设置站点名称,名称必须由 blah-blah-blah... 系统组成必须为每个创建的站点生成一个唯一的代码等等)?也许这个问题也与(1)我的问题有关。
    • 感谢您的精彩回答,马克!它真的对我的工作有帮助,你把我的想法融合在一起!
    【解决方案2】:

    我认为 Marc 配得上这个大大的绿色勾号,这要归功于他令人惊讶的彻底回答!

    我只是想添加一些 cmets。

    1. 您不需要自动化所有您的场景。

    如果您想以每个人(即包括非精通技术的人)都能理解的形式捕获业务需求,并且 Gherkin 的 Given/When/Then 为您工作,那就去做吧。没有什么会迫使您将所有场景自动化。

    1. 您无需通过 UI 自动化所有您的场景。

    您的软件由通常通过不同接口(UI、HTTP、API...)响应类似行为的层组成。如果您想用自动化的小黄瓜场景来描述细粒度的业务规则(即站点名称约束),您可以编写直接与您的域层对话的步骤定义,而不是通过用户界面。那可能仍然会给你相当大的信心。

    作为旁注,如果您的目的是与非技术人员分享您的测试/需求,我建议不要在经典测试框架(即只有开发人员才能看到的框架)中使用 Given/When/Then。

    1. 进行对话!

    最重要的是,BDD 是关于更好的沟通:尝试多交流,让您的开发人员(或其中一些人)更早地参与流程,以便他们更快地获得更多知识。将 Gherkin 情景形式化进入第二阶段。自动化它们甚至应该在您的优先级列表中更靠后!

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 1970-01-01
      • 2020-10-23
      • 2010-09-17
      • 2012-07-28
      • 1970-01-01
      • 2012-10-19
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多