Как сделать второй сценарий непосредственно следовать за первым в Огуречном - PullRequest
1 голос
/ 29 ноября 2010

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

Scenario: Registered user wants to upload avatar
  Given I follow "Upload picture"
  When I attach the file "spec/fixtures/kitten.jpg" to "user_avatar"
  And I press "Upload"
  Then I should see "Picture was successfuly uploaded."
  And I should be on the user crop page

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

Scenario: User just uploaded avatar
  Given I just uploaded "spec/fixtures/kitten.jpg" as my avatar
  When I crop it to 100x100 px
  And I press "Crop"
  Then my avatar should have 100x100 px
  And I should see "Picture successfuly cropped."

Однако здесь я должен определить

Given I just uploaded "spec/fixtures/kitten.jpg" as my avatar

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

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

Какова в целом правильная стратегия, позволяющая нескольким сценариям следовать друг за другом и передавать свое состояние следующему?

Ответы [ 2 ]

3 голосов
/ 29 ноября 2010

Как правило, вы не хотите, чтобы тесты были обусловлены друг другом. Они должны быть в состоянии бежать самостоятельно и в любом порядке. В тот момент, когда вы начнете объединять свои тесты, начнется затруднение отладки сбоев.

Учитывая, что я только что загрузил "spec / fixtures / kitten.jpg", так как мой аватар не обязательно должен быть точной копией первого кука. Вы также можете легко создать файл в файловой системе и любые необходимые модели на этапе Cucumber. Вы уже знаете, что часть загрузки работает, поэтому вам не нужно делать полную загрузку перед кадрированием для второго примера.

Или, альтернативно, вы можете сделать один шаг, содержащий:

Given I follow "Upload picture"
When I attach the file "spec/fixtures/kitten.jpg" to "user_avatar"
And I press "Upload"

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

0 голосов
/ 08 декабря 2010

Мне кажется, что вы должны стремиться сделать все свои тесты самодостаточными, а также стремиться к подходу, основанному на деятельности, а не на задачах.Я бы рекомендовал что-то вроде этого:

(Примечание: я использую Groovy здесь, потому что мне не очень удобно с Ruby)

Scenario: User just uploaded avatar
Given I just uploaded "spec/fixtures/kitten.jpg" as my avatar
When I crop it to 100x100 px
And I press "Crop"
Then my avatar should have 100x100 px
And I should see "Picture successfuly cropped."

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

Given(~'I just uploaded "(.+)" as my avatar') { avatar ->
    uploadAvatar(avatar)
}

def uploadAvatar(avatar) {
    //place the previous steps in here.
}

Кажется, намного проще, чем то, что вы делали для меня.

Примечание: действие против задачи можно объяснить следующим примером: представьте, что мы тестируем банкомат.Действия: «Идентифицировать в банк», «Снять деньги» и т. Д., Задачи: «Подход банкомат», «Ввести пин-код», «проверить пин-код», «выбрать сумму», «нажмите ОК» и т. Д ...,

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

...