Сквозные тесты в сравнении с юнит-тестами, следует ли разделять тесты?

23

Как правило, в нашей компании мы пишем комплексный тест для наших веб-сайтов / веб-приложений. Это означает, что мы получаем доступ к URL-адресу, заполняем форму, отправляем форму на другой URL-адрес и проверяем результаты на странице. Мы делаем это для проверки правильности формы, проверки правильности контекстных шаблонов HTML и т. Д.

Мы также используем его для косвенного тестирования базовой логики.

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

Мне интересно, имеет ли смысл такого рода разделение или это просто способ избежать написания тестов для небольших блоков кода?

Рудольф Олах
источник
6
was told by a co-worker that the reason for this is that we can rip out and change the underlying implementation at any point as long as the end-to-end tests pass.- Это также верно для юнит-тестов. Мне кажется, что сквозные тесты используются как оправдание для того, чтобы не писать модульные тесты.
Роберт Харви
12
Это не относится к юнит-тестам. Изменение / удаление / создание методов или классов требует обновления всех модульных тестов для этих методов или классов. Не так в сквозных тестах, если функциональность конечного пользователя не меняется. Пока это рефакторинг системного уровня (без изменения функциональности конечного пользователя), никаких изменений в сквозных тестах не требуется.
dietbuddha
2
@ dietbuddha, я думаю, что общая концепция верна для модульных тестов, но в меньшем (единичном) объеме.
Сэм

Ответы:

38

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

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

Карл Билефельдт
источник
Это хороший ответ. Я вижу ценность обоих, но, видя количество возможностей для полного тестирования всех путей с сквозными тестами, полезно объяснить, почему модульное тестирование нужно делать больше, чем оно есть
Рудольф Олах
14
Я считаю модульные тесты ценными в основном потому, что они быстро локализуют проблемы. Конец в конец ценны, потому что они дают вам уверенность, что все работает вместе.
Джейсон Светт
20

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

Док Браун
источник
2
Быстрая заметка о формулировке; хотя это и не точная наука, многие скажут, что комплексные тесты и интеграционные тесты - это разные вещи. См stackoverflow.com/questions/4904096/...
sbrattla
6

После нескольких лет написания кода и работы над проектами я дам ответ на свой вопрос.

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

Если вы используете фреймворк, такой как Django или Rails (или ваши собственные пользовательские классы), у вас должен быть класс формы, который будет обрабатывать проверку формы. У вас также будут классы представления, которые отображают визуализированные шаблоны, а также формы и обрабатывают запросы GET и POST.

В конце теста вы бы:

  1. получить URL
  2. заполните форму с действительными данными
  3. разместить форму на URL
  4. проверьте, чтобы база данных была обновлена ​​или какое-либо действие было выполнено в результате правильной формы

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

Давайте попробуем это снова с юнит-тестами:

  1. проверить метод GET view
  2. проверить метод POST вида с фальшивой / фиктивной формой
  3. проверить форму с правильными данными
  4. проверить форму с неверными данными
  5. проверить побочные эффекты формы

Используя модульные тесты, вы тестируете меньшие фрагменты кода, и эти тесты специфичны и их легче писать. Когда вы комбинируете это с TDD (Test Driven Development), вы получаете код более высокого качества.

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

Рудольф Олах
источник
Еще один источник данных - блог тестирования Google говорит «нет» дополнительным тестам end2end: googletesting.blogspot.ca/2015/04/…
Рудольф Олах,
5

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

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

m3th0dman
источник
1

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

На моей работе мы проводим Acceptance Test Driven Development без модульных тестов, которые звучат так же, как вы описали. Мы начали делать и со временем, и в конечном итоге исключили юнит-тестирование, что привело к тому, что затраты превысили наши выгоды.

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

dietbuddha
источник
Что меня беспокоит, так это то, что мы будем кодировать приемочные тесты, которые приводят к большим классам или методам, а не к меньшим единицам.
Рудольф Олах
@omouse: Только потому, что вы не пишете модульные тесты, нет причин не писать хороший код. Однако, если у вас есть программисты, которые неопытны или просто имеют вредные привычки, то преимущества могут перевесить затраты. В любом случае вам следует провести анализ и свести его к простому уравнению. For Any Practice: Practice iff Benefit > Cost
dietbuddha