Включает ли TDD интеграционные тесты?

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

Спасибо!


person Jon Onstott    schedule 24.09.2013    source источник


Ответы (4)


Золотое правило TDD гласит: никогда не пишите новые функции, не провалив тесты.

Если вы не следуете этому правилу, значит, вы выполняете TDD частично (например, пишете модульные тесты только для нескольких классов в вашем приложении). Это лучше, чем ничего (по крайней мере, вы знаете, что эти классы делают то, что требуется, но вы не можете быть уверены, что другие части приложения работают и эти классы могут быть интегрированы с ними), но это не гарантирует, что ваше приложение работает должным образом. Итак, вам нужно начинать каждую функцию с написания неудачного приемочного теста, который направляет дизайн вашего приложения и определяет поведение приложения (внешний цикл). Пока этот тест не проходит, эта функция не реализована вашим приложением. Затем вы должны написать модульные тесты для отдельных модулей, которые будут задействованы в этой функции (внутренний цикл). Внешний цикл проверяет, что все классы, задействованные в этой функции, работают вместе, как ожидалось. Внутренний цикл проверяет, что каждый класс работает, как ожидалось, сам по себе.

На следующем рисунке из замечательной книги Growing Object-Oriented Software, Guided by Tests показаны эти две петли обратной связи в TDD:

TDD

И ответ на ваш вопрос: да - TDD включает интеграционные тесты. Это единственный способ не нарушить золотое правило TDD.

person Sergey Berezovskiy    schedule 25.09.2013
comment
что, если приемочное испытание частично повторяет модульные тесты? скажем, у меня есть callApi(routeName) функция, которая использует getRouteConfig(routeName) внутри. Должен ли я тестировать callApi для получения правильной конфигурации, если это делается внутренним getRouteConfig вызовом? - person oluckyman; 17.08.2016
comment
Мне очень нравится этот ответ. Я хочу еще раз подтвердить это, сославшись на интересный факт, а именно то, что TDD даже взял много новых имен с единственной целью убедиться, что интеграционный тест не пропущен, и чтобы прояснить, что он действительно является частью цикла TDD. Вот несколько ссылок, которые подробно раскрывают эту тему: cucumber.io/blog/bdd/example -guided-development и todaysoftmag.com/article/849 / bdd-javascript-and-jasmine - person Christian Quirós; 11.12.2019

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

Из Разработка через тестирование на примере («Макет объекта " шаблон) :

Решение - не использовать большую часть времени настоящую базу данных.

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

Что, если фиктивный объект не ведет себя как настоящий? Вы можете уменьшить эту стратегию, имея набор тестов для фиктивного объекта, который также может быть применен к реальному объекту, когда он станет доступным.

В общем, я думаю, что вся интеграция с модульным тестом ортогональна TDD. Другими словами: наличие небольшого цикла обратной связи красный / зеленый / рефакторинга в качестве вашего атомарного строительного блока не определяет, какой вариант общего рабочего процесса разработки приложения вы должны выбрать или какие другие циклы обратной связи должны его окружать - это может быть принято как @lazyberezovsky объяснены, снаружи внутрь или наизнанку, ориентированы на интеграцию или изоляцию и т. д., если вы остаетесь правдивыми в отношении подхода, ориентированного на тестирование.

person guillaume31    schedule 25.09.2013

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

person boskop    schedule 25.09.2013

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

person ottodidakt    schedule 25.09.2013
comment
TDD - это не разработка, основанная на модульных тестах. Как указывалось в других ответах, явная попытка различения между ними перед написанием теста не приносит никакой пользы. Случай, который вы пытаетесь протестировать, будет либо модулем, либо интеграцией, но функцией или правилом, которые все еще необходимо протестировать, поскольку они работают в производственной среде. - person Usman Mutawakil; 10.03.2017