Избегая повторения себя в Gherkin

Итак, я использую specflow некоторое время, и что-то меня беспокоит.

Это пример сценария, который мы в настоящее время используем:

Scenario: Select a region via selection button
    When I select "Scotland" from Available Regions
    And I click on the "Select One" button
    Then Available Regions does not contain "Scotland"
    And Selected Regions contains "Scotland"

есть ли away, чтобы не говорить "Шотландия" почти на каждой строке ? Или это делает его более читаемым, и я должен просто придерживаться его ?

4 ответов


прежде чем я попытаюсь ответить на ваш вопрос, Могу я предложить вам взять минуту, чтобы пойти и прочитать Дэн Норт кто домен это в любом случае.

Итак, во-первых, я хотел бы избавиться от строки, которая говорит And I click on the "Select One" button, потому что я думаю, что это должно быть неявно частью When I select "Scotland" from Available regions.

теперь у вас есть

Scenario: Select a region 
    When I select "Scotland" from Available Regions
    Then Available Regions does not contain "Scotland"
    And Selected Regions contains "Scotland"

и вы могли бы написать это как

Scenario: Select a region 
    When I select "Scotland" from Available Regions
    Then Available Regions does not contain the last selected region
    And Selected Regions contains the last selected region

есть ли большая разница? Скорее всего, нет.

что я нашел как я провел больше времени с огуречным, является то, что он помогает реструктурировать свои сценарии так, как вы рефакторинг кода за ними. В C#/SpecFlow мы могли бы реализовать

    Then Available Regions does not contain "Scotland"

С

    [Then("Available Regions does not contain (.*)")]
    public void ThenAvailableRegionsDoesNotContain(string region)
    {
        AvailableRegions.Contains(region).ShouldBeFalse();
    }

и

    Then Available Regions does not contain the last selected region

С

    [Then("Available Regions does not contain the last selected region")]
    public void ThenAvailableRegionsDoesNotContainLastSelectedRegion()
    {
        ThenAvailableRegionsDoesNotContain(LastSelectedRegion);
    }

это честно-решать вам. Какой диалект вы предпочитаете


интересный пример!

Как заявили другие, обычно рекомендуется избегать подробностей реализации в ваших сценариях-вот для чего предназначены определения шагов. Но ты это уже знаешь.

вопрос, который я бы тогда задал: кому вы доказываете это поведение? Кто заинтересован в утверждении, что вы можете нажать кнопку или дважды щелкнуть с помощью формального теста? Если ваш ответ Не "никто", то, возможно, это касается:

"когда это сценарий был написан, вы можете себе представить, что заинтересованной стороне, вероятно, было все равно, как ... как только мы начнем вводить опции ... деталь. .. вдруг стало интересно ...

на данный момент я ожидаю, что этот сценарий будет дополнен некоторыми более мелкозернистыми или низкоуровневыми сценариями, каждый из которых описывает различные [варианты], которые мы поддерживаем. Эти новые сценарии будут ориентированы на другую заинтересованную сторону."

от комментарии к Дэну Норту: "чей это домен?"

возможно, вы хотите, чтобы сценарий был написан в обеих формах: один более высокий уровень просто демонстрирует, что пользователь может выбрать регион для бизнес-парней (как не имеет значения) и еще два, для другого участника, показывающего различные варианты для этого.

Итак, как только вы решили, что делаете is стоит, я, вероятно, просто повторю " Шотландия "(таблица для одно значение здесь излишне).

на немного другой ноте, я также предлагаю:

Then Available Regions should not contain "Scotland"
And Selected Regions should contain "Scotland"

Я бы рекомендовал пересмотреть название этого сценария. "Выберите регион" на самом деле не говорит вам, чего ожидать от этого примера. Это может быть какое-то сложное поведение, которое запускается при выборе региона, или крошечная деталь пользовательского интерфейса, такая как выбранный регион, перемещается из доступных регионов в список выбранных регионов.

Если я правильно понимаю ваш пример, это последний, поэтому я бы предложил такой заголовок:

Scenario: Selected region should be moved from available to selected regions

имея более выразительное название имеет ИМХО к преимуществам:

1) Вы можете быстрее перемещаться и находить соответствующие примеры в своей живой документации, когда вы ищете определенную деталь: чтение выразительного названия всегда быстрее, чем чтение всего примера и обратное проектирование его намерения.

2) для более сложных сценариев (которых в этом примере, похоже, нет) выразительное название, передающее намерение сценария, помогает читателю лучше понять детали сценария быстро.

чтобы сделать сценарий более интересным для чтения, я бы объединил утверждения в один шаг, так как вы действительно хотите утверждать, что выбранный элемент был перемещен из доступного в выбранный список:

Scenario: Selected region should be moved from available to selected regions
  When I select "Scotland" from "Available Regions"
  Then "Scotland" should be moved from "Available Regions" to "Selected Regions"

Я думаю, что это довольно близко к тому, как я бы объяснил эту деталь кому-то в разговоре. Я бы не прочь повторить "Шотландия" здесь, хотя некоторые люди могут предпочесть замену "Шотландия" на "выбранный регион", так как AlSki уже указывать. Это дело вкуса, и я обычно стараюсь слушать, какие именно слова были использованы во время разговора о сценарии, что должно произойти всегда, прежде чем записывать его.

в качестве незначительной заметки я хочу упомянуть, что у меня сложилось впечатление, что это сценарий относительно довольно низкоуровневой детали пользовательского интерфейса. Мне было бы гораздо интереснее, какое влияние он оказывает на более высоком уровне, когда я выбираю конкретный регион (если выбор региона имеет какую-либо конкретную деловую значимость вообще). И если вы действительно хотите описать и автоматизировать проверку такой низкоуровневой детали пользовательского интерфейса в сценарии, я бы рассмотрел возможность показать это также в том, как я формулирую сценарий:

Scenario: Selected region should be moved from available to selected regions list
  When I select "Scotland" from the "Available Regions" list
  Then "Scotland" should be moved from the "Available Regions" to "Selected Regions" list

конечно, я только что предположил, что вы описываете подробное поведение пользовательского интерфейса списка в своем сценарии, поскольку вы не писали о списке в своем исходном сценарии. Если речь идет не о пользовательском интерфейсе, то, что вы описываете, сценарий должен быть сформулирован по-другому выразить это лучше.


хотя я согласен с @AlSki, что некоторый рефакторинг-хорошая идея, вы можете использовать Examples синтаксис для использования одного и того же значения несколько раз:

Scenario Outline: Select a region
  Given do this "<value>"
  And do that "<value>"
  When we perform "<value>"
  Then we get "<value>"
Examples:
  | value    |
  | Scotland |

вы также можете добавить несколько записей в таблицу, чтобы запустить один и тот же тест много раз с разными значениями каждый раз:

...
Examples:
  | value    |
  | Scotland |
  | England  |
  | Wales    |

вот пример С несколькими значениями, что позволяет вам делать такие вещи, как:

Scenario Outline: Select a region
  Given do this "<value>" with "<area>"
  And do that "<value>"
  When we perform "<value>"
  Then we get "<result>"
Examples:
  | value    | area   | result |
  | Scotland | North  | 40     |
  | Scotland | South  | 100    |
  | England  | West   | 200    |
  | England  | North  | 180    |