Избегайте повторений в «Огурце»

Итак, я уже некоторое время использую 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"

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


person Mark Broadhurst    schedule 18.09.2012    source источник


Ответы (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);
    }

Это честно зависит от вас. Какой диалект вы предпочитаете

person AlSki    schedule 18.09.2012
comment
+1 за ссылку. Я согласен с вами по поводу And I click on the "Select One" button, но у меня есть другой сценарий, который в основном такой же, но с I double click on "Scotland" from Available Regions, который различает тесты. Я согласен с вашими пунктами, но последний выбранный регион не является огромным улучшением. - person Mark Broadhurst; 19.09.2012
comment
+1. Я также стараюсь избегать таких слов, как «щелкни и нажми кнопку». Лично я бы оставил его как Шотландию для каждой строки, так как когда тест терпит неудачу, это явно и гораздо проще выяснить, что не удалось. - person marto; 19.09.2012
comment
Щелчок и двойной щелчок — это действия пользовательского интерфейса, которые вызывают операцию. Этот сценарий, похоже, находится в рабочем домене, а не в домене пользовательского интерфейса, поэтому вместо этого я предлагаю вам использовать такие термины, как выбор и редактирование (при условии, что двойной щелчок вызывает редактирование). Нет ничего плохого в том, чтобы иметь еще один набор тестов, которые подтверждают, что щелчок и двойной щелчок сопоставляются с операциями выбора и редактирования (или имитируют их), но это серьезно помогает изолировать хрупкость тестов, когда вы работаете таким образом. Надеюсь, поможет. - person AlSki; 19.09.2012
comment
Двойной щелчок также является опцией выбора, то есть пользователь может дважды щелкнуть свой выбор или выбрать его и нажать кнопку выбора. Это одна и та же пользовательская операция, которую можно применять двумя разными способами. Вероятно, он погружается в домен пользовательского интерфейса. - person Mark Broadhurst; 19.09.2012

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

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

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

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

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

Из комментариев к статье Дэна Норта «Чей это домен?»

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

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

В несколько иной ноте я также предлагаю:

Then Available Regions should not contain "Scotland"
And Selected Regions should contain "Scotland"
person Tom Tom    schedule 27.09.2012
comment
Привет, Том, хорошие моменты, владелец продукта осваивает идею TDD, поэтому, хотя я бы поспорил, что она интересуется только высоким уровнем, как вы предлагаете, настаивает на том, чтобы большинство случаев низкого уровня (различные типы методов отбора) проверяются, но отдельные элементы данных (в данном случае Шотландия) не представляют интереса. И отличный момент по поводу отсутствия ценности, а также того, что она переместилась в нужное место. - person Mark Broadhurst; 27.09.2012
comment
Возможно, если она этого хочет, это того стоит! - person Tom Tom; 28.09.2012
comment
В лучшем случае 50/50, но она решает. :-) - person Mark Broadhurst; 28.09.2012

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

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

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

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

person chr99ha    schedule 30.09.2012

Хотя я согласен с @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    |
person dave.c    schedule 19.09.2012
comment
Схема сценария с одним примером делает сценарий излишне техническим и скучным для читателя (помните, что Cucumber — это средство коммуникации, а не язык сценариев). - person jbpros; 27.09.2012
comment
@jbpros Это чисто для иллюстрации, чтобы понять концепцию. - person dave.c; 27.09.2012
comment
Привет, dave.c, спасибо за вклад. Мне известно о Scenario Outline\Template, хотя я согласен, что это СУШИТ пример, и я думаю, что потеря удобочитаемости не окупится для одного примера. Однако, если бы у меня было несколько примеров, тогда да, в точку. - person Mark Broadhurst; 27.09.2012