4

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

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

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

场景:Base64 二进制项目
给定我以管理员身份登录 admin
并且我选择了 Sample Project
并且我选择查看包含来自 factcollection1 和所有期间和所有客户端的数据的报告演示视图
当我单击 excel 单元格 F3
并单击在名为 base64 binary item 的行的 2 列中的值
然后 Excel 单元格 F3 应包含值 asdf

场景:布尔项目
假设我以管理员身份登录,
并且我选择了示例项目
,并且我选择查看包含来自 factcollection1 和所有期间和所有客户的数据的报告演示视图
当我单击 excel 单元格 J3
并单击值在标题为布尔项的行的 2 列中
然后 Excel 单元格 J3 应包含值 true

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

之前的场景:
假设我以管理员身份登录 admin
并且我选择了 Sample Project
并且我选择查看包含来自 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

3 回答 3

3

您可以使用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                  |
于 2011-11-22T00:53:36.590 回答
1

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

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

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

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

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

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

于 2011-01-20T10:58:22.467 回答
0

这个答案已经晚了 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.

漂亮整洁。

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

于 2019-10-22T17:04:31.163 回答