[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"general-list":3,"slate-glossary-term-tdd":4,"footer-feature-tags":183},true,{"detail":5,"more":124},{"id":6,"slug":7,"translations":8,"category":22,"tags":31,"letter":55,"og_image":26,"cover":26,"author_name":26,"author_position":26,"author_avatar":26,"faqs":56,"related":70,"views_count":120,"helpful_yes_count":59,"helpful_no_count":59,"created_at":121,"updated_at":122,"published_at":123},394,"tdd",{"ru":9},{"title":10,"short_definition":11,"tldr":12,"full_explanation":13,"when_to_apply":14,"when_not_to_apply":15,"examples":16,"tips":17,"synonyms":18,"translation_en":19,"seo_title":20,"seo_description":21},"TDD (разработка через тестирование)","Способ писать код, при котором сначала появляется падающий тест, потом минимальный код для его прохождения, потом уборка.","TDD — цикл из трёх шагов, который называют «красный, зелёный, рефакторинг». Сначала пишут маленький тест, который не проходит. Потом пишут ровно столько кода, чтобы он прошёл, любыми средствами. Потом убирают дубли и приводят код в порядок, сохраняя поведение. Практику описал Кент Бек в книге 2002 года «Test-Driven Development: By Example», настаивая, что лишь переоткрыл давно известный приём.","\u003Cp>Главный эффект TDD лежит в стороне от тестов. Чтобы написать тест первым, приходится заранее решить, как модуль будет вызываться и что вернёт. Проектирование интерфейса случается до реализации, и это меняет форму кода сильнее, чем сами проверки.\u003C\u002Fp>\u003Ch3>Цикл\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cstrong>Красный\u003C\u002Fstrong>: тест написан и падает. Иногда он даже не компилируется, и это нормально.\u003C\u002Fli>\u003Cli>\u003Cstrong>Зелёный\u003C\u002Fstrong>: код доводят до прохождения теста самым коротким путём, допуская любые упрощения.\u003C\u002Fli>\u003Cli>\u003Cstrong>Рефакторинг\u003C\u002Fstrong>: убирают дублирование и наводят порядок, тесты при этом остаются зелёными.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Шаги короткие: Бек описывал их длиной в минуты.\u003C\u002Fp>\u003Ch3>Чего TDD не даёт\u003C\u002Fh3>\u003Cp>Покрытие тестами и TDD — разные вещи. Тесты, дописанные после кода, дают ту же цифру покрытия и никак не влияют на устройство модуля. Обратное тоже верно: команда с полным TDD пропустит ошибку, которой нет в тестах, потому что тест проверяет только то, что автор придумал проверить.\u003C\u002Fp>\u003Ch3>Где буксует\u003C\u002Fh3>\u003Cp>Тяжелее всего TDD идёт на коде, плотно сросшемся с внешним миром: интерфейсы, интеграции, унаследованные модули без швов. Обычно там начинают с тестов на уровне поведения, а внутрь спускаются по мере того, как код удаётся разъединить.\u003C\u002Fp>","\u003Cul>\u003Cli>Логика с ветвлениями и расчётами: скидки, тарифы, права доступа\u003C\u002Fli>\u003Cli>Код, который будут менять долго и часто\u003C\u002Fli>\u003Cli>Исправление ошибки: тест воспроизводит её до правки\u003C\u002Fli>\u003C\u002Ful>","\u003Cul>\u003Cli>Прототип, который выбросят после проверки гипотезы\u003C\u002Fli>\u003Cli>Вёрстка и визуальные детали интерфейса\u003C\u002Fli>\u003Cli>Код, целиком состоящий из вызовов внешней системы\u003C\u002Fli>\u003C\u002Ful>","\u003Cp>В биллинге появляется ошибка: скидка для годовой подписки считается от суммы, к которой уже применили скидку за объём. Разработчик начинает с теста, который повторяет случай клиента и падает. Затем правит расчёт до зелёного. Затем разносит два вида скидок по отдельным функциям, потому что тест уже страхует поведение. Тест остаётся в наборе и ловит ту же ошибку через полгода при переписывании тарифов.\u003C\u002Fp>","\u003Cp>Начинайте с ошибок. Правило «на каждый баг сначала тест» приживается легче, чем полный переход на цикл, и сразу даёт видимую пользу: одна и та же ошибка перестаёт возвращаться. В карточке задачи на исправление удобно держать ссылку на тест — при разборе повторного обращения сразу видно, что именно проверяется.\u003C\u002Fp>","TDD, разработка через тестирование, тест-первый подход, test-driven development, красный зелёный рефакторинг","Test-Driven Development (TDD)","TDD — разработка через тестирование | Глоссарий Shtab","TDD: цикл «красный, зелёный, рефакторинг», зачем писать тест до кода и чем это отличается от покрытия тестами. Где практика работает и где буксует.",{"id":23,"slug":24,"hex":25,"icon":26,"order":23,"translations":27},1,"agile","#5e79ec",null,{"ru":28},{"title":29,"description":30},"Agile","Гибкие методологии разработки и управления проектами: Scrum, Kanban, XP и их элементы — спринты, бэклоги, церемонии, роли.",[32,37,46],{"id":23,"slug":33,"kind":33,"hex":25,"order":23,"translations":34},"methodology",{"ru":35},{"title":36},"Методология",{"id":38,"slug":39,"kind":40,"hex":41,"order":42,"translations":43},14,"process","phase","#4b5370",22,{"ru":44},{"title":45},"Процесс",{"id":47,"slug":48,"kind":49,"hex":50,"order":51,"translations":52},31,"quality","other","#0F9488",71,{"ru":53},{"title":54},"Качество","T",[57,64],{"id":58,"order":59,"translations":60},1755,0,{"ru":61},{"question":62,"answer":63},"TDD замедляет разработку?","\u003Cp>На старте да: первые недели уходят на привычку и на тесты, которых раньше не писали. Отдача приходит на изменениях, потому что переписать код, закрытый тестами, дешевле — поломка видна сразу. На коде, который менять не будут, вложение не окупается.\u003C\u002Fp>",{"id":65,"order":23,"translations":66},1756,{"ru":67},{"question":68,"answer":69},"Чем TDD отличается от юнит-тестов?","\u003Cp>Юнит-тест — это вид проверки, TDD — порядок работы. Можно писать юнит-тесты после кода и не применять TDD. Разница в том, что при TDD тест влияет на устройство модуля, потому что появляется раньше него.\u003C\u002Fp>",{"related":71},[72,79,86,93,100,107,113],{"id":73,"slug":74,"translations":75},393,"extreme-programming",{"ru":76},{"title":77,"short_definition":78},"Экстремальное программирование (XP)","Гибкая методология разработки Кента Бека: короткие циклы, тесты до кода, парная работа и постоянная сборка доведены до предела.",{"id":80,"slug":81,"translations":82},397,"refactoring",{"ru":83},{"title":84,"short_definition":85},"Рефакторинг (Refactoring)","Изменение внутреннего устройства кода без изменения его поведения: код становится понятнее и дешевле в правке, а результат работы остаётся прежним.",{"id":87,"slug":88,"translations":89},395,"continuous-integration",{"ru":90},{"title":91,"short_definition":92},"Непрерывная интеграция (CI)","Практика, при которой изменения от всех разработчиков попадают в общую ветку по нескольку раз в день и каждый раз автоматически собираются и проверяются тестами.",{"id":94,"slug":95,"translations":96},396,"pair-programming",{"ru":97},{"title":98,"short_definition":99},"Парное программирование (Pair Programming)","Двое разработчиков пишут один код на одном рабочем месте: один набирает, второй следит за направлением, роли регулярно меняются.",{"id":101,"slug":102,"translations":103},20,"definition-of-done",{"ru":104},{"title":105,"short_definition":106},"Definition of Done (критерии завершённости)","Согласованный командой перечень условий, при выполнении которых задача считается полностью завершённой.",{"id":42,"slug":108,"translations":109},"acceptance-criteria",{"ru":110},{"title":111,"short_definition":112},"Acceptance Criteria (критерии приёмки)","Конкретные проверяемые условия, которым должна соответствовать пользовательская история, чтобы её приняли как выполненную.",{"id":114,"slug":115,"translations":116},78,"quality-gate",{"ru":117},{"title":118,"short_definition":119},"Quality Gate (контрольная точка проекта)","Контрольная точка между фазами проекта, на которой проверяется соответствие критериям перед переходом дальше.",29,"2026-08-30T15:05:42.823516+03:00","2026-08-30T15:05:42.823534+03:00","2026-08-30T15:05:42.894002+03:00",[125,144,160],{"id":23,"slug":24,"translations":126,"category":129,"tags":132,"letter":142,"cover":26,"updated_at":143,"published_at":26},{"ru":127},{"title":29,"short_definition":128,"translation_en":29},"Семейство гибких подходов к разработке продуктов и управлению проектами, основанное на коротких итерациях и быстрой адаптации к изменениям.",{"id":23,"slug":24,"hex":25,"icon":26,"order":23,"translations":130},{"ru":131},{"title":29,"description":30},[133,136],{"id":23,"slug":33,"kind":33,"hex":25,"order":23,"translations":134},{"ru":135},{"title":36},{"id":137,"slug":138,"kind":49,"hex":41,"order":137,"translations":139},8,"concept",{"ru":140},{"title":141},"Концепция","A","2026-04-25T22:42:14.793028+03:00",{"id":42,"slug":108,"translations":145,"category":148,"tags":151,"letter":142,"cover":26,"updated_at":159,"published_at":26},{"ru":146},{"title":111,"short_definition":112,"translation_en":147},"Acceptance Criteria",{"id":23,"slug":24,"hex":25,"icon":26,"order":23,"translations":149},{"ru":150},{"title":29,"description":30},[152],{"id":153,"slug":154,"kind":49,"hex":155,"order":153,"translations":156},4,"artifact","#888ca0",{"ru":157},{"title":158},"Артефакт","2026-04-25T22:42:15.380450+03:00",{"id":161,"slug":162,"translations":163,"category":168,"tags":171,"letter":181,"cover":26,"updated_at":182,"published_at":26},10,"burndown-chart",{"ru":164},{"title":165,"short_definition":166,"translation_en":167},"Burndown chart (диаграмма сгорания)","График, который показывает, сколько работы осталось в спринте или релизе по дням.","Burndown chart",{"id":23,"slug":24,"hex":25,"icon":26,"order":23,"translations":169},{"ru":170},{"title":29,"description":30},[172,175],{"id":153,"slug":154,"kind":49,"hex":155,"order":153,"translations":173},{"ru":174},{"title":158},{"id":176,"slug":177,"kind":177,"hex":50,"order":176,"translations":178},6,"metric",{"ru":179},{"title":180},"Метрика","B","2026-04-25T22:42:15.056246+03:00",[184,192,197,206,211,216,222,228,232,237],{"id":137,"name":185,"hex":186,"translations":187,"count_pages":191},"Компания","#f40925",{"ru":188,"en":189},{"name":185},{"name":190},"Company",9,{"id":193,"name":194,"hex":26,"translations":195,"count_pages":137},26,"Главная страница",{"ru":196},{"name":194},{"id":198,"name":199,"hex":200,"translations":201,"count_pages":205},2,"Проекты","#3027ff",{"ru":202,"en":203},{"name":199},{"name":204},"Project",15,{"id":207,"name":208,"hex":26,"translations":209,"count_pages":198},33,"ИИ",{"ru":210},{"name":208},{"id":212,"name":213,"hex":26,"translations":214,"count_pages":153},34,"Комментарии",{"ru":215},{"name":213},{"id":217,"name":218,"hex":26,"translations":219,"count_pages":221},25,"Задачи",{"ru":220},{"name":218},24,{"id":223,"name":224,"hex":26,"translations":225,"count_pages":227},27,"Рабочие пространства",{"ru":226},{"name":224},3,{"id":221,"name":229,"hex":26,"translations":230,"count_pages":137},"Kanban-доска",{"ru":231},{"name":229},{"id":233,"name":234,"hex":26,"translations":235,"count_pages":23},23,"Диаграмма Ганта",{"ru":236},{"name":234},{"id":205,"name":238,"hex":26,"translations":239,"count_pages":23},"Календарь",{"ru":240},{"name":238}]