Почему огурец считается инструментом интеграционного тестирования вместо инструмента модульного тестирования? - PullRequest
12 голосов
/ 17 ноября 2010

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

Мне кажется, что для cucumber и rspec написано одинаковое количество кода, единственное отличие состоит в том, что для cucumber вы отделяете тестовую логику от тестовой записи.

Ответы [ 5 ]

7 голосов
/ 02 декабря 2010

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

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

Просто для обновления, функция будет содержать следующее:

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

Given a precondition
When I perform an action
Then something should happen

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

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

Given a that a database mock is configured with the following data
| ID  | Username |
| 0   | igor     |
When call FindAll on User Repository
Then I get the following user back
| ID  | Username |
| 0   | igor     |

Кроме того, поскольку размер SUT становится меньше (т. Е. Класс), контекст операции не так важен.Пользовательский репозиторий не заботится о контексте, например, его не волнует, является ли его потребитель обычным пользователем или VIP-пользователем.Простой компонент (который должен быть после SRP) является полностью детерминированным на основе его входных данных.

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

5 голосов
/ 18 ноября 2010

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

Она также представляет целый ряд других проблем.Во-первых, вам нужно привязать сценарии Cucumber к набору приборов, так что есть еще один уровень абстракции, который замедляет их запись.Во-вторых, английский сложнее реорганизовать, чем код, даже с динамическими языками, такими как Ruby (разница еще более заметна в вариантах C # и Java, таких как JBehave, SpecFlow, Cuke4Nuke и Cuke4Duke).Труднее сказать, все ли еще используются шаги, и сложнее поддерживать сценарии.Также сложнее управлять состоянием между различными этапами.

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

Из-за накладных расходов Cucumber и потому, чтомы не получаем выгоды от преимуществ, предоставляемых Cucumber в обмен на накладные расходы, RSpec лучше подходит для поведения на уровне подразделений.(Это также относится и к JUnit, NUnit и т. Д.)

Если вам не хватает «Задано, когда, тогда» в Cucumber, попробуйте добавить их в качестве комментариев.Это хорошо работает для меня.

1 голос
/ 17 ноября 2010

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

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

Юнит-тестирование = Инженер-механик тестирует свой новый двигатель в лабораторных условиях, установленных на жгуте.

Тестирование огурца = Тест-водитель ставит его на дорожку для отжима.

0 голосов
/ 07 марта 2014

По словам Аслака Хеллесёя, Cucumber - это не инструмент тестирования, а инструмент совместной работы (для BDD).Недавно он опубликовал сообщение об этом очевидном заблуждении:

https://cucumber.pro/blog/2014/03/03/the-worlds-most-misunderstood-collaboration-tool.html

Тем не менее, существует много тестов, написанных ниже уровня приемки, которые упадут вокруг уровня интеграционных тестов.То есть

Given a user at 123 Evergreen Terrace
When I lookup their name
Then I get Homer Simpson

вместо

Given an address
When I lookup a name
Then the home owner name is displayed

Не помогает то, что cukes.info показан в качестве императивного примера (а не декларативного).

Тесты на огурцы выполняются медленно по сравнению с тестами Rspec или Test :: Unit или MiniTest.У них много накладных расходов (может потребоваться несколько минут, чтобы загрузить среду, включая все классы Page Object, проанализировать файлы объектов и фактически выполнить тесты).Выполнение только модульных тестов Cucumber было бы быстрее, чем выполнение интегральных эквивалентных тестов, но не так быстро, как выполнение чего-то более легкого, такого как три вышеупомянутых.

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

0 голосов
/ 11 октября 2011

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

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

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

Итог:

модульный тест проверяет, что определенный фрагмент кода соответствует его контракту с остальным миром ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...