【问题标题】:cucumber Repeat steps黄瓜重复步骤
【发布时间】:2014-12-13 12:13:05
【问题描述】:

我正在学习黄瓜并尝试编写功能文件。

以下是我的功能文件。

功能:医生交接笔记模块

Scenario: Search for patients on the bases of filter criteria
Given I am on website login page
When I put username, password and select database:
  | Field        | Value        |
  | username     | test         |
  | password     | pass         |
  | database     | test|
Then I login to eoasis
Then I click on doctors hand over notes link
And I am on doctors handover notes page
Then I select sites, wards, onCallTeam, grades,potential Discharge, outstanding task,High priority:
  | siteList      | wardsList                     | onCallTeamList   | gradesList | potentialDischargeCB | outstandingTasksCB | highPriorityCB |
  | THE INFIRMARY | INFIRMARY WARD 9 - ASSESSMENT | null             | null       | null                 | null               | null           |
  | THE INFIRMARY | INFIRMARY WARD 9 - ASSESSMENT | GENERAL MEDICINE | null       | null                 | null               | null           |
  | THE INFIRMARY | INFIRMARY WARD 9 - ASSESSMENT | GENERAL MEDICINE | CONSULTANT | null                 | null               | null           |
  | THE INFIRMARY | INFIRMARY WARD 9 - ASSESSMENT | GENERAL MEDICINE | CONSULTANT | true                 | null               | null           |
  | THE INFIRMARY | INFIRMARY WARD 9 - ASSESSMENT | GENERAL MEDICINE | CONSULTANT | true                 | true               | null           |
  | THE INFIRMARY | INFIRMARY WARD 9 - ASSESSMENT | GENERAL MEDICINE | CONSULTANT | true                 | true               | true           |
Then I click on search button
Then I should see search results

我想重复最后三个步骤,例如选择搜索条件,然后单击搜索按钮,然后检查搜索结果。那么我应该如何打破这个功能文件。如果我使用场景大纲,那么将有两种不同的场景一种用于登录,另一种用于搜索条件。可以吗?在这种情况下会话会保持吗?编写此类功能文件的最佳方法是什么。

或者这是一种正确的写作方式?

【问题讨论】:

    标签: unit-testing cucumber


    【解决方案1】:

    我认为我们不能在一个场景大纲中包含多个示例集。 示例中的大多数场景步骤过于程序化,无法拥有自己的步骤。 前三个步骤可以简化为类似的东西。

    Given I am logged into eoasis as a <user>
    

    步骤定义中的代码,它可以调用一个单独的登录方法,该方法可以负责更新输入用户名、密码和选择数据库。

    另一条规则是避免“当我点击医生的交接链接”之类的语句。此处要避免的关键字是 click。今天它是一个点击,明天它可能是下拉或按钮。所以重点应该放在用户的功能期望上,即查看交接记录。所以我们将其修改为

    When I view the doctor's handover notes link
    

    总而言之,这就是我编写此测试的方式。

    Scenario Outline: Search for patients on the basis of filter criteria
    Given I am logged into eoasis as a <user>
    When I view the doctor's handover notes link
    And I select sites, wards, onCallTeam, grades, potential Discharge, outstanding task, High priority
    And perform a search
    Then I should see the search results
    
    Examples: 
    |sites          |wards                          |onCallTeam        |grades      |potential Discharge   |outstanding task    |High priority|
    | THE INFIRMARY | INFIRMARY WARD 9 - ASSESSMENT | null             | null       | null                 | null               | null        |
    

    【讨论】:

    • 您好 Roonie,感谢您的回答。我想我对编写功能文件不是很清楚,但现在我有了一些想法,因为 diabolist 也解释了这一点,但仍然有一些疑问。因此,从我上面的示例中,我们不需要为所有搜索条件编写功能文件,也不应该验证所有条件的所有结果是否正确?我们应该只检查搜索结果页面,页面上的结果是什么并不重要?
    • 不,你绝对可以写一个专门用于搜索的特征文件。在该功能文件中,您可以拥有所需的所有各种搜索场景。您需要小心编写太高级别的测试,这可能会立即失败,并且您无法弄清楚它们失败的原因。我们编写的测试需要足够具体,但又不能太低级。好的场景介于命令式和声明式之间。无论哪种方式精益,您的测试最终都不会那么有用。
    【解决方案2】:

    这确实是编写功能的错误方式。这个特性是非常具有声明性的,它完全与你如何做某事有关。一个特性应该做的是解释你为什么要做某事。

    此功能的另一件坏事是混淆了两个不同操作的细节,即登录和搜索患者。为每一个写一个特征,例如

    Feature: Signing in
      As a doctor
      I want my patients data to only be available if I sign in
      So I ensure their confidentiality
    
    Scenario: Sign in
      Given I am a doctor
      When I sign in
      Then I should be signed in
    
    Feature: Search for patients
      Explain why searching for patients gives value to the doctor
      ...
    

    您应该关注功能的名称以及顶部解释为什么它首先具有价值的位。如果你做得好,那么场景会更容易编写(看看我的登录场景是多么简单)。

    编写功能的艺术在这方面做得很好,所以你最终会得到简单的场景。

    【讨论】:

    • 好的,但是您完全忽略了他需要在搜索患者功能中登录。这就是问题所在。如何在一个场景中加入这两个基本步骤。 PS:diabol是神的敌人。你也是吗?
    • 不,我没有忽略他需要登录。第二个功能应该有一个背景,让医生登录然后搜索病人。每个场景都需要执行该操作的人才能登录。您不应尝试在场景之间让该人保持登录状态。
    • 空竹是马戏团的道具,我曾经很擅长,因此得名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多