Да, более одного цикла When
/Then
уместно в сценарии с корнишонами, когда этого требует реальный сценарий.
Ответ SaxonMatt прекрасно подчеркивает, что сценарии лучше всего писать на языке заинтересованных сторон, а не на языке манипуляций с пользовательским интерфейсом, и что выполнение так часто сокращает длину сценария, но это упускает из виду точную суть вопроса. Возьмем быка за рога.
Огурец был разработан для приемочных испытаний: тестов, которые проверяют, что требования уровня заинтересованных сторон были полностью реализованы, то есть, что программное обеспечение действительно представляет ценность для заинтересованных сторон. Иногда предоставление ценности требует более одного цикла действия-ответа. Рассмотрим следующий сценарий:
Scenario: Guest buys a product
# This scenario starts with the user not logged in, which doesn't require a step
Given there is a product named "Elliptical Juicer"
When I go to the product page for "Elliptical Juicer"
And I add the product to my shopping cart
Then I should see 1 product in my shopping cart
When I request to check out
Then I should see the account creation form
When I create an account
Then I should see the checkout form with 1 product, "Elliptical Juicer"
When I check out
Then I should see the checkout success page with 1 product, "Elliptical Juicer"
And I should receive a checkout confirmation email with 1 product, "Elliptical Juicer"
(Обратите внимание, что когда у меня есть более одного цикла When
/Then
в сценарии, мне нравится разделять их пустыми строками, чтобы они выделялись.)
Есть несколько причин, по которым этот сценарий лучше всего писать с несколькими циклами When
/Then
:
Прежде чем пользователь выполнит проверку, он должен увидеть один продукт в своей корзине (только в виде цифры в заголовке сайта, поэтому на шаге не упоминается название продукта). Нет возможности проверить это требование в конце сценария. (Ну, тест мог бы собирать информацию сразу после того, как пользователь добавил товар в свою корзину, и утверждать ожидаемое количество в конце сценария, но это было бы бессмысленно скрытно и запутанно.) Вместо этого, утверждать правильное количество в естественном место в сценарии, как только оно будет видно пользователю.
Точно так же Then I should see the account creation form
и Then I should see the checkout form with 1 product, "Elliptical Juicer"
могут тестировать важные требования в тех точках сценария, в которых их проверка естественна.
Предположим, нас не заботило, что пользователь увидит в процессе, а только дойдет ли он до конца сценария со своим продуктом в пути. Затем мы можем опустить промежуточные Then
шагов:
Given there is a product named "Elliptical Juicer"
When I go to the product page for "Elliptical Juicer"
And I add the product to my shopping cart
And I request to check out
And I create an account
And I check out
Then I should see the checkout success page with 1 product, "Elliptical Juicer"
And I should receive a checkout confirmation email with 1 product, "Elliptical Juicer"
And I create an account
вызывает удивление, не так ли? Это требует, чтобы читатель сделал вывод, что гостевого пользователя просят создать учетную запись во время оформления заказа. Нагляднее сказать так явно, как в первом варианте сценария, который я привел.
Предположим, ни одно из вышеперечисленных опасений нас не убедило, и мы написали отдельный сценарий корнишона для каждой точки общего сценария, где нам нужно было утверждать, что требования были выполнены:
Scenario: Guest adds a product to their shopping cart
Given there is a product named "Elliptical Juicer"
When I go to the product page for "Elliptical Juicer"
And I add the product to my shopping cart
Then I should see 1 product in my shopping cart
Scenario: Guest with a product in their shopping cart attempts to check out
Given I have a product in my shopping cart
When I request to check out
Then I should see the account creation form
Scenario: Guest creates an account
Given I have a product named "Elliptical Juicer" in my shopping cart
And I am on the account creation form
When I create an account
Then I should see the checkout form with 1 product, "Elliptical Juicer"
Scenario: Newly registered user checks out
Given I am a user
And I have a product named "Elliptical Juicer" in my shopping cart
And I am on the checkout form
When I check out
Then I should see the checkout success page with 1 product, "Elliptical Juicer"
And I should receive a checkout confirmation email with 1 product, "Elliptical Juicer"
Это ужасно! Во-первых, ни один из сценариев не является тем, о чем заинтересованная сторона могла бы подумать как о сценарии. Во-вторых, при изменении одного из промежуточных состояний должны измениться два шага: шаг, подтверждающий промежуточное состояние, и шаг Given
, устанавливающий промежуточное состояние для следующего сценария. Каждый из этих Given
шагов — это возможность установить неправильное состояние, то есть совершить ошибку интегрирования. Этот набор сценариев имеет гораздо меньшую ценность как набор интеграционных тестов, чем отдельный сценарий. Возможно, вы почти написали серию модульных тестов.
Это правда, что написание каждого сценария от начала до конца может привести к некоторому дублированию. Точно так же, как вы допускаете дублирование в модульных тестах больше, чем в обычном коде, в сценариях с огурцами вы допускаете дублирование еще больше, чем в модульных тестах. Не экономьте на понятности. Разбивайте сценарии и используйте Given
только в критических точках (например, при создании продукта в приведенном выше примере) и делайте это, зная, что вы ослабляете возможности своих сценариев по тестированию интеграции.
Кроме того, имейте в виду, что приемочные тесты должны быть только частью вашего автоматизированного набора тестов. Напишите только достаточно приемочных тестов, чтобы охватить критические сценарии, и покройте детали модульными тестами. Довольно часто решение проблемы дублирования приемочных тестов заключается в замене одного модульным тестом.
person
Dave Schweisguth
schedule
21.07.2017