【问题标题】:How much data should be given in a cucumber feature file?黄瓜特征文件中应该给出多少数据?
【发布时间】:2020-05-16 00:00:04
【问题描述】:

我正在尝试编写一些 Gherkin 功能文件,以便使用 SpecFlow 进行 BDD 验收测试。我正在尝试测试的系统由多个 RESTful API 组成——系统具有微服务架构。在一个场景中,在使用实际场景之前,我需要确定一些记录已经存在于数据库中,所以我包含了一个 Background 部分和一个 given 部分。我遇到的问题是,需要存在的每个记录都是通过 API 创建的,这些 API 在其架构联系人中需要大量数据,并且团队要求我在小黄瓜的记录中指定每个字段及其各自的值桌子。结果是这样的:

| PassportExpireDate|PassportNumber|PassportCountry |Firstname|Lastname|LocalFirstname|LocalLastname | Birthday | NationalNumber | NationalityCountryId | PassengerType | Gender |PartyId | SourceTravelerId | CellNumber | Price|

这是我的一个表的表头,它将用于在开始按规范进行实际测试之前在数据库中创建 Traveler 记录。但是,正如您所看到的,该表的字段太多,因此太长而无法在屏幕上显示,因此很难阅读和维护。其次,它与 DTO 模式紧密耦合。我认为我们不应该在我们的规范上放这么多细节,试图只包括重要的高级数据(例如,考虑到我们有一个名为“James Peterson”的现有旅行者),但团队和 CTO 坚持认为这些细节应该是出现在功能文件上。在我的下一次尝试中,我将表格拆分为多个表格(例如个人数据、订单数据、护照数据等)。

但我仍然很困惑,我认为我仍然没有做 wrie 的事情。你有什么建议?我们对此有任何经验法则或最佳做法吗?

【问题讨论】:

  • 如何将所有数据放入文件中,例如 .csv,并在“鉴于文件 中的所有记录都存在于数据库中”的步骤中读取此文件?这样就不需要直接放到特征文件中了。
  • @MrCas 这对于垂直减小表的大小并将实际数据与特征文件分离是一个好主意。但即使我这样做了,我的问题仍然存在,因为我仍然需要指定列(字段)。请注意,编写测试步骤的开发人员必须使用 DTO 将实际请求发送到 API。

标签: cucumber bdd gherkin acceptance-testing


【解决方案1】:

您能否将数据表中的字段和值转置如下。

      |field                 |values    |
      | PassportExpireDate   |[]        |
      | PassportNumber       |[]        |
      | PassportCountry      |[]        |
      | Firstname            |[]        |
      | Lastname             |[]        |
      | LocalFirstname       |[]        |
      | LocalLastname        |[]        |
      | Birthday             |[]        |
      | NationalNumber       |[]        |
      | NationalityCountryId |[]        |
      | PassengerType        |[]        |
      | Gender               |[]        |
      | PartyId              |[]        |
      | SourceTravelerId     |[]        |
      | CellNumber           |[]        |
      | Price                |[]        |

并在步骤 def 中实现从值数组中获取值的逻辑。

【讨论】:

  • 如果您对此实施有任何疑问或需要帮助,请告诉我。唯一的挑战是我们必须确保所有字段的数组项计数相同。
【解决方案2】:

Specflow 支持此类情况的外部数据绑定。您可以使用Excel binding 来保持您的功能文件合适。

Scenario Outline: Add Traveler
    Given ...
    When  ....
    Then  ....

@source:TravelerRecordsExamples.xlsx
Examples:
| PassportExpireDate|PassportNumber|PassportCountry |Firstname|Lastname|LocalFirstname|LocalLastname | Birthday | NationalNumber | NationalityCountryId | PassengerType | Gender |PartyId | SourceTravelerId | CellNumber | Price|

【讨论】:

    【解决方案3】:

    TLDR 无

    不要将定义和数据放在 Gherkin 表中,这会适得其反并且容易出错。而是使用其他东西来指定字段(最好是 api 的源代码)并命名每个事物。

    然后使用简单的 Givens 来为你创造东西。

    现在,在您的情况下,您似乎正在创造旅行者。你的小黄瓜记录的行为是旅行者的创造。旅行者是如何产生的,以及他们的特征是什么,在此行为描述中没有位置。

    所以你的背景步骤变成了

    Given there are foo travelers
    

    实现类似于

    Given 'there are foo travelers' do
      create_foo_travelers
    end
    
    

    现在你已经翻译了你的问题

                         from
    
    How do I do something incredibly stupid and difficult in Gherkin 
    
                          to
    
    How do I write some code to create travelers
    

    这是在 Cuking 时编写所有场景时应采用的方法。场景应该只记录行为的内容和原因。任何关于行为如何实现的细节在场景中都没有位置。

    cuking 的真正力量在于使用自然语言、命名和抽象来让你的 cuke 变得简单。使用这些技能将 HOW 的复杂性委托给更合适的工具。

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      相关资源
      最近更新 更多