在编写 BDD 功能时,我应该将之前的用户交互放入给定步骤还是何时步骤中?

2024-03-13

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

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

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 "[email protected] /cdn-cgi/l/email-protection" owned by "Bob Test"
      And the "[email protected] /cdn-cgi/l/email-protection" Account has the "Repair Order Creator"
        permission
      And you log in as "[email protected] /cdn-cgi/l/email-protection"
      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"

But on 小黄瓜维基 https://github.com/cucumber/cucumber/wiki/Given-When-Then,建议您:

避免谈论给定的用户交互

不过,他们继续破例:

登录用户(无交互建议的例外。“较早发生”的事情是可以的)。

该页面上还提到:

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

如果您有大量 UI 交互,什么属于给定,什么属于 When?

在我的第一个场景中,select Use PD需要 UI 交互,因为它是创建新维修订单向导的一部分。但它是 PD Filter 可见的前提条件,当用户进入“选择技术人员”页面时触发。

第一种情况可能没那么糟糕,但第二种情况会使问题恶化。当您点击时会触发搜索Search但必须执行许多 UI 交互才能导航到该页面。其中一些相互作用也不能被掩盖,例如Use PD必须选择搜索过滤器才能出现。但这些 UI 交互并不是关键行动场景的。


作为一般规则,请尽可能多地表达该场景,就好像您正在就此进行对话一样,并尽可能多地排除不相关的信息。

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

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 与测试无关。这是关于提出人们将如何使用该系统的示例,以便您可以围绕这些示例进行对话并探索它们,找到例外情况和不同的场景等。

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

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

使用友好的角色名称也很有用,因为人们可以想象弗雷德和乔治的样子。

去掉任何不会对场景产生影响、也不会帮助人们想象它发生的东西。您知道鲍勃有权安排订单,因为这就是他正在做的事情 - 只需向该步骤添加必要的内容即可。

“何时”是您有兴趣描述的行为。在本例中,您对筛选个人诊断的能力感兴趣,因此与行为相关的所有用户交互都应位于“何时”中,并且所有先前的交互均应位于“给定”中。我发现尝试考虑结果不同的环境很有用 - 例如,如果没有 PD 技术人员,会发生什么?这告诉我有什么区别;我们将设置一个不同的context但执行相同的操作event。上下文属于“给定”,事件属于“何时”。 (在引入“背景”之前,这曾经要简单得多)。

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

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在编写 BDD 功能时,我应该将之前的用户交互放入给定步骤还是何时步骤中? 的相关文章

  • 检查 RSpec 中的 ActiveRecord 关联

    我正在学习如何使用 Rspec 编写测试用例 我有一个简单的帖子评论支架 其中帖子可以有很多评论 我正在使用 Rspec 对此进行测试 我应该如何检查Post has many comments 我应该存根吗Post comments方法
  • 如何使用 NSpec 在 Visual Studio 中进行调试

    如何使用 NSpec 在 Visual Studio 中进行调试 我已经安装了 resharper 我需要进入我的测试代码 另一个不错的选择是只输入 System Diagnostics Debugger Launch 在你想要调试的测试中
  • Cucumber 在运行单个功能时找不到步骤

    我刚刚将 Cucumber 安装到一个新的 Rails 项目中 第一次从头开始设置 并且在运行所有测试时效果非常好 bundle exec cucumber 但当我运行单个功能文件时找不到我的任何步骤 我该如何开始调试这个 rails 3
  • 目前是否有适用于 iOS4 和 Xcode4 的 BDD 解决方案?

    所以我一直在努力寻找 iOS4 和 Xcode4 的可靠 BDD 替代品 但一切似乎要么很久以前就被放弃了 要么sortof工作但相当混乱 我找到的最好的解决方案称为 Cedar 主要文章 http pivotallabs com user
  • 如何在 ASP.NET MVC 中以 BDD 风格进行单元和集成测试?

    我正在学习使用 ASP NET MVC 进行行为驱动开发 并且基于a post http blog stevensanderson com 2010 03 03 behavior driven development bdd with sp
  • 如何根据环境实现cucumber场景不同的数据

    我在不同环境中执行 cucumber jvm 场景时遇到问题 场景的特征文件中包含的数据属于一个环境 为了在不同的环境中执行场景 我需要根据要执行的环境更新功能文件中的数据 例如 在以下场景中 我将搜索条件包含在功能文件中 搜索条件对于 Q
  • MongoDB.service 失败,结果退出代码

    我无法使用命令 sudo systemctl start mongod 启动 mongoDB 我收到以下消息 mongod service MongoDB Database Server Loaded loaded lib systemd
  • 技术实现细节如何编写User Stories? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在尝试以更有组织的方式工作并开始采用用户故事 我认为我对如何将用户故事用于技术内容存在误解 假设我正在编写一个应用程序 它可以提供我的网站在
  • 黄瓜的路由问题

    我正在使用 Rails 3 和 Cucumber 除了这个小问题之外一切都很顺利 Given I am on the edit automobile page No route matches controller gt automobil
  • Cucumber IDE 可以自动完成功能编写吗?

    有没有Eclipse插件可以用来写黄瓜的特点 http github com aslakhellesoy cucumber wiki feature introduction具有自动完成功能 我想从其他功能中找到并重用步骤会很好 有任何想法
  • 如何使用 rspec + capybara 重用不同功能中的场景

    假设我有一些场景想要在不同的上下文或 功能 下进行测试 例如 我有一些场景涉及用户访问某些页面并期望某些 ajax 结果 但是 在不同的条件或 功能 下 我需要执行不同的 后台 任务来更改应用程序的状态 在这种情况下 我需要一遍又一遍地运行
  • IntelliJ 中的 Cucumber.js 调试

    IntelliJ 有一个 Cucumber js 插件 这假设可以在 IDE 内启用运行和调试 cucumber js 的运行配置有效 但调试模式已停用 无法单击 调试 按钮 还有其他人有同样的问题并设法解决它吗 调试对我来说非常重要 谢谢
  • BDD 和 Behat 特殊字符

    有类似的问题 Behat 和输入验证场景中的 Gherkin https stackoverflow com questions 6561815 gherkin in behat and input validations scenario
  • 行为 3 中如何在上下文之间进行通信?

    我无法再在版本 3 中使用 getMainContext 和 getSubcontext alias 版本 3 中上下文之间的通信方式是什么 上下文特征是唯一的方式吗 behat yml default suites guest featu
  • 我可以覆盖 test_helper.rb 中的任务:环境来测试 rake 任务吗?

    我在 Rakefile 中有一系列 rake 任务 我想将其作为我的规范等的一部分进行测试 每个任务都以以下形式定义 task do somthing gt environment do Do something with the data
  • 如何使用 MSTest 从命令行运行 SpecFlow 场景?

    我有 Visual Studio 2010 并且我们有两个使用的 VS 解决方案 第一个是 Web 应用程序 第二个是严格用于 SpecFlow 测试 同时运行两个 Visual Studio 实例来运行 SpecFlow 功能会占用所有可
  • 是否可以将小黄瓜步骤写在多行上?

    我是小黄瓜语言的新手 在我看来这似乎是非常基本的问题 但我找不到答案 我知道可以在 Gherkin 中编写多行步骤参数 如下所示 Given a blog post named Random with Markdown body Some
  • 将 C# 单元测试名称转换为英文(testdox 样式)

    我有一大堆用 MbUnit 编写的单元测试 我想从测试名称生成简单的英语句子 这里介绍一下这个概念 http dannorth net introducing bdd http dannorth net introducing bdd 这是
  • Specflow 在具有场景上下文的表中使用参数

    我正在 C 中使用 Specflow 通过 Selenium 构建自动客户端浏览器测试 这些测试的目的是模拟客户在特定页面进入我们网站的业务场景 然后他被引导到正确的页面 我想在场景上下文中使用参数 例如 When I visit url
  • gem 如何提供 Cucumber 功能和步骤定义?

    我有两个 Rails 项目 A 和 B 其中包含以下宝石 project A gem green theme path gt dev themes green theme gem devel tasks path gt dev themes

随机推荐