Лучшая практика для написания реальных возможностей / сценариев bdd огурцов - PullRequest
9 голосов
/ 30 марта 2011

Мы новички в bdd / cucumber и обсуждаем в нашей команде, как писать правильные функции / сценарии.

Мы предложили два следующих подхода, которые должны почти описать / решить одно и то же требование:

Feature: Give access to dossiers to other registered users
  As a logged in user
  In order to show my dossier to other users
  I want to give other users (limited) access to my dossiers

  Background:
    Given I am logged in as "Oliver"
    And another user "Pascal" exists
    And another user "Tobias" exists

  Scenario: I can give access to my own dossier
    When I grant access to "Pascal" with permisson "readonly"
    Then I should see "Access granted."
    And user "Pascal" should have permission "readonly" on dossier "Oliver"

  Scenario: I can give access to a created dossier
    Given I created a new dossier "Max Müller"
    When I grant access on dossier "Max Müller" to "Pascal" with permisson "readonly"
    Then I should see "Access granted."
    And user "Pascal" should have permission "readonly" on dossier "Max Müller"

  Scenario: I can give access to a managed dossier
    Given I manage the dossier from "Tobias"
    When I grant access on dossier "Tobias" to "Pascal" with permisson "readonly"
    Then I should see "Access granted."
    And user "Pascal" should have permission "readonly" on dossier "Tobias"

  Scenario: I cannot give access to a writable dossier
    Given I have write access to the dossier from "Tobias"
    When I follow "Grant access"
    Then I should see "You are not allowed to grant access on this dossier."

  Scenario: I cannot give access to a readonly dossier
    Given I have readonly access to the dossier from "Tobias"
    When I follow "Grant access"
    Then I should see "You are not allowed to grant access on this dossier."

  Scenario: I can give access to a dossier with an expiration date
    Given I created a new dossier "Max Müller"
    When I grant access on dossier "Max Müller" to "Pascal" with permisson "readonly" until "2020-01-01"
    Then I should see "Access granted till 2020-01-01."
    And user "Pascal" should have permission "readonly" on dossier "Max Müller" until "2020-01-01"

  Scenario: I cannot transfer a created dossier to a new owner who is already registered
    Given I created a new dossier "Max Müller"
    When I transfer dossier "Max Müller" to "Pascal"
    Then I should see "Pascal already has a dossier, transfer not possible."

Второй:

Feature: Grant access on dossiers to registered users
  As a logged in user
  In order to allow others to view/ manage dossiers I have access to
  I want to give access of those to other users

  Background:
    Given I am logged in as "gucki@email.com"
    And I am working with my own dossier

  Scenario: Invalid data entered 
    When I visit the grant dossier access page
    And I press "Grant access"
    Then I should see a validation error on "eMail-Address"

  Scenario: Valid data entered 
    Given a user "pascal@email.com" exists
    When I visit the grant dossier access page
    And I fill in "eMail-Address" with "pascal@email.com"
    And I select "readonly" from "Permissions"
    And I press "Grant access"
    Then I should see "Access granted."
    And I should be on the dossiers page

  Scenario: Valid data entered with expiry date 
    Given a user "pascal@email.com" exists
    When I visit the grant dossier access page
    And I fill in "eMail-Address" with "pascal@email.com"
    And I select "readonly" from "Permissions"
    And I fill in "Valid until" with "2010-03-01"
    And I press "Grant access"
    Then I should see "Access granted till 2010-03-01."
    And I should be on the dossiers page

  Scenario: Display calendar on click on "Valid until"
    When I click on the field "Valid until"
    Then a calendar popup should be displayed
    When I click on "1943-01-02"
    Then the field "Valid until" should be have "1943-01-02"
    And the calendar popup should be hidden

  Scenario: Only allow to grant access to categories I have access to myself
    Given I have limited access to the working dossier 
    When I visit the grant dossier access page
    Then I should not see categories I have no access to

  Scenario: Dossier with permission "manager" can only grant readonly, readwrite
    Given I have the permission "manager" on my working dossier 
    When I visit the grant dossier access page
    Then I should only see the permissions "readonly, readwrite"

  Scenario: Dossier with permission "readwrite" is not allowed to grant any permissions
    Given I have the permission "readwrite" on my working dossier 
    When I visit the grant dossier access page
    Then I should the see the error "You cannot grant access on this dossier!"
    And I should be on the dossiers page

Какой из них вы бы предпочли и почему?

Ответы [ 6 ]

13 голосов
/ 03 апреля 2011

Смысл написания тестов Cucumber состоит в том, чтобы создать спецификацию о том, что делает код, которую могут прочитать люди в вашей команде, которые не могут прочитать код.Я бы начал с того, чтобы спросить их, какой из них они предпочитают.

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

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

Недавно я выступал с докладом на эту тему, я думаю, что он действительно имеет отношение к тому, где вы находитесь: http://skillsmatter.com/podcast/agile-testing/refuctoring-your-cukes

См. Также эти соответствующие сообщения в блоге:

Удачи!

6 голосов
/ 30 марта 2011

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

Сказав, что я думаю, что первое решение представляет читаемый стиль больше, чем второе решение.

«Я могу предоставить доступ к досье с датой истечения срока действия»

легче читать, чем

«Допустимые данные, введенные с датой истечения срока действия»

на мой взгляд.

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

Обновление

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

  1. Полное валидационное тестирование в Cucumber
  2. Частичное валидационное тестирование (ошибки представляются пользователю) в Cucumber и частичное тестирование в RSpec (генерируются ошибки) - или в какой-либо другой структуре модульного тестирования.

Вариант 1

Плюсы:

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

минусы:

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

Опция 2

Плюсы:

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

cons:

Вы должны использовать другую структуру, чтобы реализовать более тонкие ожидания.Использование другого фреймворка означает, что нужно больше времени на его изучение и т. Д. Также трудно понять, как найти баланс, когда использовать один фреймворк над другим, т. Е. «Я должен использовать здесь Cucumber или RSpec?»

Из чегопрочитал, вариант 2 является самым популярным прямо сейчас.Команды используют структуры, соответствующие каждому уровню детализации, и стараются держаться подальше от подхода «все в одном».

5 голосов
/ 16 января 2012

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

Это сообщение в блоге, "Сняты учебные колеса" от (одного из?) Производителя огурцов (Аслака Хеллесёя), нацелено прямо на разницу между двумя вариантами, которые вы написали. Он недвусмысленно объясняет, что декларативные, сфокусированные на предмете, легкие для понимания функции - это то, чего должны стремиться пользователи огурца и что делает ваш вариант 1 победителем.

Он в основном говорит, что попытки достичь СУХОГО функционального шагов на языке системы (нажмите на это, выберите это и т. Д.) Являются запахом кода в Cucumber. По его словам:

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

Кстати, многие здесь говорили, что цель Cucumber состоит в том, чтобы упростить чтение и понимание для покупателя. Я думаю, что это немного от цели, и легкость понимания не является целью. Я думаю, что они сделали Cucumber для того, чтобы заказчик и разработчик говорили на одном языке и работали ради одинаковых результатов. Таким образом, речь идет не только о том, чтобы заставить разработчиков встать на ноги клиента, но и о том, как помочь клиенту понять процесс разработки.

4 голосов
/ 30 марта 2011

Я предпочитаю первый тип сценария, потому что он лучше описывает, как работает функция

Кроме того, у вас есть тестовый рефакторинг, чтобы сделать его с набросками сценариев, посмотрите этот пост в блоге, здорово работать с огурцом http://eggsonbread.com/2010/09/06/my-cucumber-best-practices-and-tips/

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

И я заполняю адрес электронной почты "pascal@email.com" И я заполняю "адрес электронной почты" с "tobias@email.com"

в отдельных сценариях. Я надеюсь изложить свою точку зрения здесь.

Также я настоятельно рекомендую вам книгу rspec и беседу , называемую внешними разработками с огурцом

Привет

2 голосов
/ 30 марта 2011

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

С этой целью стиль в вашем первом примере не представляет никакой сложности по сравнению со вторым примером. Легко.

1 голос
/ 02 апреля 2011

Я предпочитаю второй подход из двух. Вот мои проблемы с подходом 1.

Когда я даю доступ к досье "Макс Мюллер "на" Паскаль "с разрешением "ReadOnly"

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

У меня такое же беспокойство по поводу

А пользователь "Паскаль" должен иметь разрешение "только для чтения" на досье "Макс" Мюллер "

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

В целом, я обеспокоен тем, что Подход 1 не тестирует через пользовательский интерфейс.

...