2009-10-13 4 views
2

В настоящее время мой процесс развития протекает следующим образом:Практика BDD с интеграционными тестами - мне также нужны модульные тесты?

  1. я описать ожидаемое поведение как интеграционный тест с помощью использования Webrat
  2. Я пишу Ruby On Rails код, чтобы обеспечить такое поведение, поэтому прохождение теста
  3. I реорганизовать, обеспечивая тесты до сих пор проходят в конце процесса
  4. Я пишу следующий тест интеграции

Мне кажется, что Defi мои тесты интеграции проверяют каждую модель, контроллер и представление, которые я могу создать. На самом деле, я ничего не пропустил, не написав модульные тесты тоже?

ответ

2

Есть ли у вас какие-либо рейк-задачи? Пользовательский код capistrano? Методы Крон? API? Monkeypatches? Как насчет интеграции приложений flex или iPhone? Бегун?

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

+0

Спасибо, Сара. Пока что нет. Это простое веб-приложение - преднамеренно простое. До тех пор пока я не создам код, который не выполняется с помощью HTML UI, я думаю, WebRat достаточно? И если я прихожу, чтобы в конечном итоге создать код, который не выполняется с помощью HTML UI, я думаю, что какого-то интеграционного теста (очевидно, не WebRat) будет достаточно? Или существует ли настоящая необходимость тестировать каждый блок отдельно в дополнение к тестированию их посредством тестов интеграции? –

+0

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

3

Интеграционные тесты полезны для проверки того, что различные части кода хорошо интегрированы. Они могут включать в себя все слои и охватывать весь код, но ... когда тест интеграции завершится неудачно, сообщит ли он, где находится ошибка? Возможно, я ошибаюсь, но я так не думаю. Это просто скажет вам, что где-то есть проблема. С другой стороны, когда реальный модульный тест (написанный изолированно с использованием mocks или stubs) терпит неудачу, вы точно знаете, в какой части находится проблема (это на самом деле цель модульного тестирования, проверяя, что единица реализует ожидаемое поведение) , Другими словами, модульные тесты и тесты интеграции полезны, но они имеют разные цели.

+0

Или, еще лучше написано в изоляции с заглушками. Около 80-90% времени ожидания тестирования более надежны, когда они работают против интерфейса. Если две реализации метода принимают одинаковые параметры и дают одинаковые возвращаемые значения для всех возможных параметров, то обычно вы хотите, чтобы один и тот же набор тестов проходил для обеих реализаций. С двойным испытанием, которое не имеет ожиданий, тесты, как правило, работают, но не так с mocks. –

+0

Другие 10-20% времени, как правило, либо вызовы API, либо код с побочными эффектами, которые вы, вероятно, должны реорганизовать в любом случае. –

+0

@Bob это правильно, и я должен был написать «написанное изолированно». Я уточню свой ответ. Mocks или stubs, мне все равно, пока тест написан изолированно (и издевательства чрезмерно используются IMHO). –

8

Я действительно симпатизирую вашей точке зрения здесь. Я люблю огурец и Я люблю RSpec - и я использую их оба, но не всегда по одному и тому же коду. Например, я редко пишу примеры RSpec для контроллеров Rails в эти дни, и я почти никогда не пишу спецификации. Большинство моих контроллеров очень похожи и не сильно отклоняются от шаблона контроллера «запаса», который уже проверен собственными модульными тестами Rails. Проверка того же поведения снова не набирает много времени и времени, издеваясь над всеми моделями. С огурцом на уровне интеграции я могу пропустить это издевательство и получить необходимую проверку, которую я ищу. Просмотр тестирования обрабатывается гораздо более прозрачно в Cucumber большую часть времени. (Тогда я должен увидеть «foo» и т. Д.)

Но это не значит, что я не использую RSpec в Rails. Я использую его для мест, где живет моя логика: модели, фильтры контроллеров и помощники просмотра. У меня также есть несколько проектов, которые почти все бизнес-логика, например. библиотек или API-адаптеров против сложных сторонних интерфейсов. Для тех, кого я обычно нахожу, я использую исключительно RSpec и пропускаю Огурец.

В эвристики, я хотел бы предложить, что вы должны сильно рассмотреть написание юнит тест в любое время любой из следующих вопросов можно ответить «Да»:

  • код, который я пишу более чем тривиально сложно?
  • Этот код существует, прежде всего, для ответа на другой код?
  • Является ли этот существующий код, который я рефакторинг (который еще не имеет модульного теста)?
  • Я нашел ошибку в этом коде? (Если это так, напишите единичный тест, прежде чем исправлять его, чтобы он никогда не проникал снова.)
  • Должен ли я думать более десяти секунд о самом элегантном способе реализации этого кода?
  • Является ли мое Чувство Чувства покалыванием?

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

+0

+1, чтобы избежать спецификации на контроллерах и представлениях. Вызовы, модели и т. Д. В модуле «lib», но в остальном оставьте его в Огурце. –

 Смежные вопросы

  • Нет связанных вопросов^_^