2013-09-24 5 views

ответ

26

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

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

После картины из большой книги Growing объектно-ориентированного программного обеспечения, руководствуясь Tests демонстрирует эти две цепи обратной связи в TDD:

TDD

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

+1

Что делать, если приемочный тест частично повторяет модульные тесты? скажем, у меня есть функция 'callApi (routeName)', которая использует 'getRouteConfig (routeName)' внутри. Должен ли я тестировать 'callApi' для получения правильной конфигурации, если это делается внутренним вызовом' getRouteConfig'? – oluckyman

1

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

7

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

От Test-Driven Development By Example («фиктивный объект» модель):

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

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

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

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

0

Одной из главных причин для выполнения Test Driven Development (в отличие от написания тестов после написания кода) является то, что он helps direct low level design. В той степени, в которой это важно, это должны быть единичные тесты, а не интеграционные тесты.

+1

TDD не является «модульной разработкой». Как указывалось в других ответах, нет никакой ценности, полученной в явной попытке отличить их до написания теста. Случай, который вы пытаетесь протестировать, будет либо единицей, либо интеграцией, но функцией или правилом, которое все еще нужно проверять, потому что оно работает в процессе производства. –

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