【问题标题】:Writing BDD feature files shorter and cleaner编写 BDD 功能文件更短更简洁
【发布时间】:2011-01-20 10:38:00
【问题描述】:

我有很多相同的场景,它们只是传递给它们的数据不同。 这是一个例子:

功能:将报告中的事实链接到 Excel 文档
为了将事实链接到 Excel 文档
作为有权访问报告的用户
我想在报告中点击事实值

场景:任何 uri 项目
鉴于我使用 admin
以管理员身份登录 我选择了示例项目
我已选择查看包含来自 factcollection1 以及所有期间和所有客户的数据的报告演示视图
当我点击 excel 单元格 C2
然后我单击标题为任何 uri 项的行的 2 列中的值
然后 Excel 单元格 C2 应该包含一些 Internet 地址的值

场景:Base64 二进制项
鉴于我使用 admin
以管理员身份登录 我选择了示例项目
我已选择查看包含来自 factcollection1 以及所有期间和所有客户的数据的报告演示视图
当我点击 excel 单元格 F3
然后我单击名为 base64 二进制项的行的 2 列中的值
那么 Excel 单元格 F3 应该包含值 asdf

场景:布尔项
鉴于我使用 admin
以管理员身份登录 我选择了示例项目
我已选择查看包含来自 factcollection1 以及所有期间和所有客户的数据的报告演示视图
当我点击 excel 单元格 J3
然后我单击标题为布尔项的行的 2 列中的值
那么 Excel 单元格 J3 应该包含值 true

我想将其缩短为如下所示:

场景之前:
鉴于我使用 admin
以管理员身份登录 我选择了示例项目
我已选择查看包含来自 factcollection1 以及所有时期和所有客户的数据的报告演示视图

场景:
当我单击 Excel 单元格 XX
然后我单击标题为 ZZ
行的 YY 列中的值 那么 Excel 单元格 YY 应该包含值 WW

还有一些表格数据,比如:

| XX | YY |          ZZ        |              WW              |
| C2 | 2  | any uri item       |    some internet address     |
| F3 | 2  | base64 binary item |               asdf           |
| J3 | 2  | boolean item       |        true                  |

我找到了解决办法。

这个能力有一个场景大纲。

Scenario Outline: display label in selected language
Given I am logged as <username> with <password>
  And I have clicked on <button> button
  Then result should be some result

Examples:
  | username | password | button |
  |  john    |  doe     | first  |
      |  foo     |  bar     | second |

【问题讨论】:

  • 因为您的问题呈现为流动文本示例难以阅读。您可以重新编辑您的问题并将示例缩进 4 个空格吗?我没有足够的权限去做。
  • 已编辑;希望现在看起来更好。

标签: bdd specflow


【解决方案1】:

您可以使用Scenario Outline 代替Scenario。您的示例如下所示:

Scenario Outline: 
  Given I am logged as admin with admin
  And I have selected Sample Project
  And I have chosen to view report presentation view containing data from factcollection1 and all periods and all clients
  When I click on excel cell '<Cell>'
  And I click on the value in '<Column>' column of the row entitled '<Row>'
  Then Excel cell '<Cell>' should contain value '<CellValue>'

Examples: 
  | Cell | Column | Row                | CellValue             |
  | C2   | 2      | any uri item       | some internet address |
  | F3   | 2      | base64 binary item | asdf                  |
  | J3   | 2      | boolean item       | true                  |

【讨论】:

    【解决方案2】:

    这是一个非常有趣的问题,我花了一些时间研究我所谓的“数据驱动规范”。这部分受到许多常见测试框架提供的“行测试”或“数据驱动测试”功能的启发。

    并不是我使用的术语“场景”和“规范”是同义词,但我更喜欢后者。

    与正常的单元测试类似,BDD 规范由三部分组成。一个常用的模板是“给定 X 当 Y 然后 Z”公式。您发现,对于您的许多规格,“X”部分保持不变。每当我遇到这种情况时,我都会尝试创建一个Fixture 类来抽象它。例如,其中一个类可能是LoggedInUserFixture,它设置登录用户并使其可用于测试。

    很多时候,您会发现需要将此灯具与其他灯具组合在一起,以便为您的规范创建设置。例如,您可能需要一个 LoggedInUserFixture 和一个 UserWithSampleProjectSelected 用于单个规范。最简单的方法是创建另一个夹具类,该类将设置其子夹具并使其单独可用于您的测试。

    我仍然抗拒提取用于组合夹具的通用模式并让测试框架支持这一点的冲动。

    回到使用数据驱动规范的建议,我认为这是一种有效且有用的模式,我通常让数据驱动我的夹具创建(夹具有一个适当的构造函数用于数据注入)。详情请参阅SubSpec's Theorie 功能。

    【讨论】:

      【解决方案3】:

      这个答案已经晚了 8 年,但 Gherkin 有办法消除这种重复。它被称为场景背景:

      Feature: ...
          In order to ...
          As a ...
          I want to ...
      
      Background:
          Given common step 1
          And common step 2
      
      Scenario: A
          When ...
          Then ...
      
      Scenario: B
          When ...
          Then ...
      

      更具体地适用于您的情况:

      Feature: Linking facts from a report into Excel document
          In order to link facts to an Excel document
          As an user having access to report
          I want to click on fact's value in the report
      
      Background:
          Given I am logged as admin with admin
          And I have selected Sample Project
          And I have chosen to view report presentation view containing data from factcollection1 and all periods and all clients
      
      Scenario: Any uri item
          When I click on excel cell C2
          And I click on the value in 2 column of the row entitled any uri item
          Then Excel cell C2 should contain value some internet address
      
      Scenario: Base64 binary item
          When I click on excel cell F3
          And I click on the value in 2 column of the row entitled base64 binary item
          Then Excel cell F3 should contain value asdf
      
      Scenario: Boolean item
          When I click on excel cell J3
          And I click on the value in 2 column of the row entitled boolean item
          Then Excel cell J3 should contain value true 
      

      三个常见的Given 步骤被移到Background,然后您的每个场景都以When 开始。

      漂亮整洁。

      这比场景大纲更可取的原因是因为您要处理多种数据的解析。大概在幕后有一些解析逻辑,并且在回归测试期间解析每种数据类型可能会以不同的方式中断。每个测试应该只有一个失败的原因,并且您的原始场景正确地捕捉到了这一点。

      【讨论】:

        猜你喜欢
        • 2013-10-13
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 2015-07-16
        • 2011-06-17
        • 2020-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多