RSpec против огурца (истории RSpec) [закрыто]

136

Когда мне следует использовать спецификации для Rails-приложения и когда Cucumber (прежние rspec-story)? Я знаю, как и работать, и активно использовать спецификации, конечно. Но все еще странно использовать огурец. Мой текущий взгляд на это заключается в том, что удобно использовать Cucumber, когда вы реализуете приложение для клиента, и пока не понимаете, как должна работать вся система.

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

И, как соответствующий второй вопрос: должен ли я писать спецификации, если я пишу истории о огурцах? Не будет ли двойное тестирование одного и того же?

Снитко
источник
12
Каким образом каждый одиночный [Closed] вопрос , который я встречаю закрыт , как «не конструктивны» Билл Ящерица И в то же время вопроса upvoted много раз!?! что мне не хватает?
Ашкан Х. Назар
4
Я абсолютно согласен. Я все еще очень запутан, где размещать такие вопросы, как «Как лучше всего делать XXX».
Дин
3
Я согласен, я сталкиваюсь с хорошими вопросами с проницательными, полезными ответами все время на SO, которые были закрыты по той или иной причине.
Рассел Сильва
Я нашел этот вопрос в 2017 году, потому что он все еще актуален, и все еще отличный вопрос с отличными ответами. Это также не вызывает мнения, так как рассматриваемые структуры были разработаны в основном одними и теми же людьми для двух совершенно разных задач ... но вам нужно немного опыта, чтобы знать это.
Луниворе

Ответы:

114

Если вы еще этого не сделали, возможно, вы захотите прочитать отличную статью Дэна Норта « Что в истории? в качестве отправной точки.

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

В нашей работе с Rails истории Cucumber не заменяют модульные тесты rspec. Два идут рука об руку. На практике модульные тесты, как правило, стимулируют разработку моделей и контроллеров, а истории, как правило, стимулируют разработку представлений (мы не склонны писать rspec для наших представлений) и обеспечивают хороший тест приложения в целом из точка зрения пользователя.

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

Abie
источник
6
Вы объединяете две отдельные проблемы; 1) хорошо ли проводить интеграционные и приемочные испытания, и 2) является ли огурец хорошим инструментом для написания этих тестов. Для 1 - да, это явно хорошая идея. Во-вторых, для команды разработчиков редко бывает более эффективно писать тесты на языке с такой большой косвенностью, когда вы можете написать очень разборчивые интеграционные и приемочные тесты в rspec и capybara (или - не дай бог, мы могли бы исследовать стандартную библиотеку Ruby - test / юнит или минитест вместе с капибарой). Смотрите пост, на который Джек Кинселла ссылается ниже.
Грэм Эштон
Полностью согласен с тобой, Аби! Интеграция огурца жизненно необходима!
dpapadopoulos
26

Думайте об этом как о цикле:

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

Джосия Киль
источник
1
Есть очень хороший пример цикла Outside-in BDD .
рдамборский
21

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

Джек Кинселла
источник
1
Я прочитал вашу статью и, как фанат огурца, должен сказать, что согласен со многими пунктами, которые вы приводите в своей статье. Хотя я все еще думаю, что огурец - это хороший способ формализовать тесты и сделать их легко читаемыми для посторонних.
Хууг
1
Джек - фантастический пост. Большое спасибо за написание, вы избавили меня от необходимости делать это самостоятельно.
Грэм Эштон
3
huug - Это может быть хорошим способом выставить тесты «посторонним», но вы покажете мне нетехнического члена команды, который хочет прочитать тесты, и я покажу вам команду, которая тратит свой бюджет. Кроме того, мне еще предстоит работать с нетехническим участником проекта, который хотел бы тратить свое время на чтение тестов. Я не знаю, может быть, мне повезло ...
Грэм Эштон
Downvoted. Я считаю, что описание пользовательских функций в терминах пользователя полезно для меня, как для разработчика, независимо от того, читали ли пользователи когда-либо мои рассказы о огурцах. Вот почему я использую Cucumber во всех своих проектах и ​​призываю других делать то же самое.
Марнен Лайбоу-Козер
8

История с Cucumber - это скорее описание общей проблемы, которую решает ваше приложение, а не то, как работают отдельные кусочки кода (например, модульные тесты).

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

Дэйв Глассбороу
источник
2
Именно. Огурец описывает использование вашего приложения. Например, «Я нажимаю здесь и ожидаю получить тот или иной результат». Спецификации больше на уровне модели. Например, когда я вызываю эти методы с такими-то параметрами, я ожидаю, что он вернет этот результат.
Ariejan
6

В настоящее время вы можете использовать rspec с Capybara и Selenium Webdriver и избежать необходимости создавать и поддерживать все парсеры историй Cucumber. Вот что я бы порекомендовал:

  1. Напиши свою историю
  2. Используя RSpec, я бы создал интеграционный тест, например: spec / integrarations / socks_rspec.rb
  3. Затем я бы создал интеграционный тест, включающий новое описание и блок для каждого сценария.
  4. Затем я реализовал бы минимальную функциональность, необходимую для тестирования интеграции, и, углубляясь назад (в контроллеры, модели и т. Д.), Я бы применил TDD для контроллеров и моделей.
  5. Когда вы вернетесь, ваш интеграционный тест должен пройти, и вы сможете продолжить добавлять шаги в интеграционный тест.
  6. повторение

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

Кроме того, как только вы найдете свою канавку, вам будет очень приятно развиваться с помощью BDD, до тех пор не испытывайте чувства вины, если вы не чувствуете, что делаете это идеально и не переоцениваете это. У тебя все получится!

PeppyHeppy
источник
2

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

Тебе все еще нужен огурец. Он нужен для документирования того, как вы видите, как работает система, и для того, чтобы убедиться, что вы не нарушили функциональность, когда меняете вещи.

Другими словами, истории Cucumber нужны по тем же причинам, что и для юнит-тестов - они просто работают на более высоком уровне абстракции.

Марнен Лайбоу-Козер
источник
2
Я бы не сказал, что Cucumber был необходим, но у вас наверняка должны быть какие-то интеграционные тесты, поскольку модульные тесты обычно используются только для тестирования классов в изоляции.
Энди Уэйт
1
Правильно. И в большинстве случаев Cucumber - лучший способ написания интеграционных тестов.
Марнен Лайбоу-Козер