SpecFlow - 是不是可以在功能文件中重用测试数据?

Posted

技术标签:

【中文标题】SpecFlow - 是不是可以在功能文件中重用测试数据?【英文标题】:SpecFlow - Is it possible to reuse test data within feature file?SpecFlow - 是否可以在功能文件中重用测试数据? 【发布时间】:2014-02-04 13:56:08 【问题描述】:

有没有办法重用 SpecFlow 功能文件中的数据? 例如。我有两种情况,都使用同一个数据表:

Scenario: Some scenario 1
  Given I have a data table
     | Field Name | Value |
     | Name       | "Tom" |
     | Age        |  16   |
  When ...

Scenario: Some scenario 2
  Given I have a data table
     | Field Name | Value |
     | Name       | "Tom" |
     | Age        |  16   |
  And I have another data table
     | Field Name | Value     |
     | Brand      | "Volvo"   |
     | City       |  "London" |
  When ...

在这些简单的例子中,表格很小,没有什么大问题,但在我的例子中,表格有 20 多行,每个至少要用于 5 次测试。

我会想象这样的事情:

Having data table "Employee"
     | Field Name | Value |
     | Name       | "Tom" |
     | Age        |  16   |

Scenario: Some scenario 1
  Given I have a data table "Employee"
  When ...

Scenario: Some scenario 2
  Given I have a data table "Employee"
  And I have another data table
     | Field Name | Value     |
     | Brand      | "Volvo"   |
     | City       |  "London" |
  When ...

我在 SpecFlow 文档中找不到类似的内容。共享数据的唯一建议是将其放入*.cs 文件中。但是,我不能这样做,因为功能文件将被非技术人员使用。

【问题讨论】:

【参考方案1】:

背景是这样的常见数据的地方,直到数据变得太大并且您的背景部分最终跨越多个页面。听起来你可能就是这种情况。

您提到每个表有 20 多行,并且有几个这样的数据表。这将是读者在进入场景之前涉足的大量背景知识。还有其他方式可以描述数据吗?过去当我有这样的数据表时,我将详细信息放入自动化代码中的固定器类中,然后仅在 Feature 文件中描述重要方面。

假设“汤姆”是一位潜在的汽车购买者,并且您正在经营某种汽车陈列室,那么他的数据表可能包括:

| Field         | Value |
| Name          | Tom   |
| Age           | 16    |
| Address       | ....  |
| Phone Number  | ....  |
| Fav Colour    | Red   |
| Country       | UK    |

您的场景 2 可能是“18 岁以下不能买车”(至少在英国)。鉴于这种情况,我们不关心汤姆的地址电话号码,只关心他的年龄。我们可以把这个场景写成:

Scenario: Under 18s shouldnt be able to buy a car
    Given there is a customer "Tom" who is under 16
    When he tries to buy a car
    Then I should politely refuse

我们只引用重要部分,而不是将 Tom 的详细信息表保留在 Feature 文件中。当Given 步骤运行时,自动化可以从我们的装置中查找“Tom”。该步骤参考了他的年龄,以便 a) 功能文件的读者可以清楚地知道 Tom 是谁,并且 b) 确保夹具数据仍然有效。

该场景的读者会立即了解 Tom(他 16 岁)的重要意义,他们不必在场景和背景之间不断引用。其他场景也可以使用Tom,如果对他的其他信息(例如地址)感兴趣,可以指定相关信息Given there is a customer "Tom" who lives at 10 Downing Street

哪种方法最好取决于您拥有多少此类数据。如果它是几个表中的少量字段,则将其放在后台,但是一旦它成为 10 多个字段或大量表(大概我们有很多潜在客户),那么我建议将其移出特征文件,只是描述每个场景中的相关信息。

【讨论】:

【参考方案2】:

是的,您使用背景,即来自https://github.com/cucumber/cucumber/wiki/Background

Background:
  Given I have a data table "Employee"
  | Field Name | Value |
  | Name       | "Tom" |
  | Age        |  16   |

Scenario: Some scenario 1
  When ...

Scenario: Some scenario 2
  Given I have another data table
  | Field Name | Value     |
  | Brand      | "Volvo"   |
  | City       |  "London" |

如果您不确定我是否发现 http://www.specflow.org/documentation/Using-Gherkin-Language-in-SpecFlow/ 是一个很好的资源

【讨论】:

以上是关于SpecFlow - 是不是可以在功能文件中重用测试数据?的主要内容,如果未能解决你的问题,请参考以下文章

在“添加新项目”窗口中找不到 SpecFlow 功能文件选项 - VS20019

如何为所有 SpecFlow 功能重新生成设计器代码

BDD Visual Studio 2015 有时当我添加新项目时我看不到 SpecFlow 功能文件

SpecFlow:ClassInitialize 和 TestContext

Specflow 与 .feature 文件的关联

想要在 Specflow C# 中对具有多个场景的每个功能文件只执行一次背景标记