ATDD — Acceptance Test Driven Development
Движущая сила: критерии приёмки (acceptance criteria), выраженные как автоматические тесты до реализации.
Уровень применения: команда (приёмочное тестирование) и код.
Статус: устоявшийся (корни в XP, конец 1990-х — начало 2000-х; систематизирован в работах Лизы Криспин, Дэна Норта, Гойко Аджича; эволюционировал в BDD и Specification by Example).
Не путать с: TDD (инженерная микро-практика на уровне юнитов) и BDD (поведение и общий язык в сценариях Given-When-Then) — подробное разведение ниже.
Общее
Acceptance Test Driven Development (ATDD) — методология разработки, при которой для каждой пользовательской функциональности сначала формулируются критерии приёмки, затем они превращаются в автоматические приёмочные тесты, и лишь потом пишется реализация. Тесты здесь — не артефакт постфактум и не инструмент разработчика (как в TDD), а общая спецификация: единый артефакт, который одновременно фиксирует, что именно строится, проверяет результат и служит документацией. Ключевая идея: если бизнес и команда не договорились о критериях приёмки до начала кодирования, то и код, и тесты пишутся вслепую.
ATDD вырос из методологии Extreme Programming (XP), где «приёмочное тестирование силами заказчика» входило в исходный набор практик. Раннее оформление подхода связано с именами Лизы Криспин (Lisa Crispin) и Типа Хауса (Tip House) — книга Testing Extreme Programming (2003), где приёмочные тесты впервые описаны как полноправная часть процесса, а не проверка постфактум. Дэн Норт (Dan North) в середине 2000-х ввёл само сокращение ATDD и показал, что проблема приёмочного тестирования — не в инструменте, а в коммуникации между бизнесом и разработкой; из этой работы напрямую вырос BDD. Гойко Аджич (Gojko Adžić) в книге Specification by Example (2011) обобщил опыт десятков команд и сформулировал подход как набор паттернов: совместное написание спецификаций, использование примеров вместо абстрактных требований, исполнение спецификаций как тестов и живая документация.
Принципиальное отличие ATDD от остальных «*DD» в этой серии — его движущая сила. Если в TDD дизайн кода направляют юнит-тесты, в DDD — модель предметной области, в FDD — процесс доставки функции, то в ATDD драйвером выступает договорённость о приёмке: конкретные, проверяемые примеры того, когда работа считается выполненной. ATDD живёт на уровне выше TDD: он задаёт рамку «что и зачем мы строим», тогда как TDD страхует «как именно написан код». В зрелой кодовой базе эти подходы дополняют друг друга: ATDD фиксирует поведение фичи целиком, TDD страхует отдельные единицы внутри неё.
Важно сразу развести три родственных подхода — TDD, ATDD и BDD, — потому что именно их смешение порождает больше всего путаницы. Все три «пишут тесты до кода», но на разных уровнях и с разными целями:
- TDD — микро-практика одного разработчика; цикл Red-Green-Refactor; уровень — единицы кода; драйвер — дизайн кода.
- ATDD — командная практика; уровень — пользовательская функциональность (фича); драйвер — критерии приёмки; формат — произвольный (таблицы, примеры, сценарии), лишь бы исполняемый.
- BDD — эволюция ATDD с акцентом на общий язык (ubiquitous language) и формат Given-When-Then; фокус смещён с тестирования на диалог бизнеса и разработки через поведение.
Развёрнутое сравнение — в разделе «Связанные подходы».
Ключевые принципы
ATDD — это не «писать приёмочные тесты» (это любая разработка с QA), а набор принципов, которые в совокупности меняют то, как требования становятся кодом. Ниже — формулировка каждого с пояснением, какую конкретную проблему он решает.
Критерии приёмки → тесты до кода. Приёмочные тесты пишутся до начала реализации, на этапе планирования фичи, а не после. Проблема: тесты, написанные постфактум, подтверждают то, что уже сделано, а не то, что предполагалось; разрыв между «что просили» и «что построили» обнаруживается поздно и дорого. Тест, написанный первым, фиксирует договорённость и делает её исполняемой — реализация проверяется против неё, а не наоборот.
Совместное написание (триадой). Приёмочные тесты формулируются не одним разработчиком и не одним QA, а всеми заинтересованными сторонами — разработчиками, тестировщиками, Product Owner-ом/аналитиком, часто и заказчиком. Проблема: требования, спущенные «сверху» в виде текстового документа, трактуются каждой стороной по-своему (классический «телефонный эффект»); совместное написание примеров вынуждает разобрать неоднозначности немедленно, пока они не превратились в код. Это та самая практика, которую Аджич назвал collaborative authoring — и которую BDD формализовал как Three Amigos (разработчик + тестировщик + аналик).
Примеры вместо абстрактных требований. Спецификация строится на конкретных примерах входных данных и ожидаемых результатов, а не на формулировках вроде «система должна корректно обрабатывать заказы». Проблема: абстрактные требования допускают десятки трактовок; пример «заказ на три позиции со скидкой 10% и купцом 500 ₽ должен вернуть итог 1850 ₽» однозначен и сразу превращается в тест. Это ядро подхода Specification by Example.
Автоматизация приёмочных тестов. Примеры оформляются так, чтобы их можно было запустить автоматически против системы, без ручных шагов. Проблема: ручное приёмочное тестирование медленное, неповторяемое и быстро отстаёт от кода; автоматизация делает спецификацию живой — она либо зелёная (соответствует коду), либо красная (расхождение), и этот статус проверяется на каждой сборке.
Живая спецификация (living documentation). Набор приёмочных тестов рассматривается как документация, которая не может устареть: если тест зелёный, он актуален. Проблема: статичная документация (Word, Confluence) рассинхронизируется с кодом за месяцы и становится источником дезинформации; исполняемая спецификация обновляется вместе с кодом и всегда отражает действительное поведение системы.
Shift-left приёмки. Момент, когда команда понимает «фича принята», смещается с финального ручного тестирования перед релизом на этап планирования. Проблема: приёмка «в конце» — это обнаружение недопонимания тогда, когда исправлять дороже всего (переписана целая фича); приёмка «в начале» (через совместно написанные тесты) ловит недопонимание до того, как написана первая строка кода. Подробнее о сдвиге тестирования влево — во введении в тестирование.
Принципы — система, а не меню. Тесты до кода без совместного написания дают «приёмочные тесты глазами одного разработчика» — то же самое недопонимание, только исполнимое. Совместное написание без автоматизации даёт стопку примеров, которые никто не запускает и которые устаревают за спринт. Автоматизация без примеров-спецификаций даёт набор e2e-тестов, которые что-то проверяют, но не служат документацией. Частичное внедрение создаёт «ATDD-theatre» — формальные приёмочные тесты без эффекта раннего консенсуса; полное — даёт именно тот сдвиг, ради которого методология и создавалась.
Как это работает
ATDD оперирует коротким циклом из четырёх фаз, повторяемым на каждой фиче. Ниже — механика.
Цикл ATDD: обсуди → дистиллируй → разработай → продемонстрируй
| Фаза | Что происходит | Кто участвует | Выход |
|---|---|---|---|
| Обсуди (Discuss) | Команда и заказчик разбирают фичу, выделяют ключевые примеры, находят неоднозначности | PO/аналитик, разработчики, QA, заказчик | Набор примеров в свободной форме |
| Дистиллируй (Distil) | Примеры превращаются в формализованные приёмочные тесты (таблицы, сценарии) | Разработчики + QA (часто с PO) | Исполняемые приёмочные тесты, красные |
| Разработай (Develop) | Пишется реализация; внутри — TDD на уровне юнитов; приёмочные тесты постепенно зеленеют | Разработчики | Работающая фича + зелёная приёмочная спецификация |
| Продемонстрируй (Demonstrate) | Зелёные приёмочные тесты показываются заказчику как доказательство выполнения договорённостей | Вся команда + заказчик | Подтверждённая приёмка |
Первые две фазы — это инвестиция в раннюю договорённость; они занимают часы или день, но предотвращают недели переделок. Третья фаза — собственно кодирование. Четвёртая — момент, когда заказчик видит не демо «на честном слове», а исполненную спецификацию.
Форма приёмочного теста
В отличие от BDD, который фиксирует формат Given-When-Then, ATDD не предписывает конкретного синтаксиса. Допустима любая форма, лишь бы она была однозначной и исполняемой. Исторически сложилось несколько стилей:
- Таблицы решений (Decision Tables) — набор «вход → ожидаемый выход» в табличном виде; классика, идущая от Fit/FitNesse.
- Сценарии Given-When-Then — формат, который позже стал ассоциироваться с BDD, но исторически вырос из ATDD.
- Ключевые слова на естественном языке (Robot Framework) — табличный DSL поверх человекочитаемого синтаксиса.
Мини-пример
Фича: «расчёт итога заказа со скидкой и купоном». На фазе «Обсуди» команда с PO договаривается о примерах:
| Сумма позиций | Скидка | Купон | Ожидаемый итог |
|---|---|---|---|
| 1000 ₽ | 10% | 0 ₽ | 900 ₽ |
| 2000 ₽ | 0% | 500 ₽ | 1500 ₽ |
| 2000 ₽ | 10% | 500 ₽ | 1300 ₽ |
На фазе «Дистиллируй» эта таблица оформляется как исполняемый тест (в FitNesse — через fixture-класс; в Robot Framework — через ключевое слово; в SpecFlow/Cucumber — через сценарий). Тест запускается — он красный (реализации нет). На фазе «Разработай» пишется реализация, внутри неё — TDD-циклы на юнит-уровне; приёмочный тест постепенно зеленеет. На фазе «Продемонстрируй» зелёная таблица показывается заказчику.
Суть цикла: каждый пример — это одновременно требование, тест и пункт документации. Их совокупность и есть спецификация фичи.
Инструменты
| Инструмент | Происхождение | Подход |
|---|---|---|
| Fit (Framework for Integrated Tests) | Ward Cunningham, 2002 | Таблицы в HTML, fixture-классы на Java/.NET; первый массовый инструмент ATDD |
| FitNesse | Object Mentor, 2005 | Wiki-надстройка над Fit; таблицы пишутся и запускаются прямо в вики |
| SpecFlow | 2010-е | .NET-порт Cucumber; сценарии Given-When-Then привязываются к шагам на C# |
| Robot Framework | Pekka Laukkanen / Nokia, 2008 | Табличный DSL на ключевых словах; поддерживает разные языки через библиотеки |
| Concord (Walmart), Gauge (ThoughtWorks) | 2010-е | Современные варианты: спецификации в Markdown/HTML, интеграция с CI |
Выбор инструмента вторичен по отношению к принципу: если команда совместно пишет примеры и автоматизирует их, ATDD работает; если нет — лучший инструмент не поможет. Подробно о месте приёмочного тестирования в общей картине качества — в материале acceptance testing.
Влияние на команду и процесс
ATDD часто обсуждают как «тестовую практику». Это сужение: устойчивый эффект возникает только тогда, когда приёмочные тесты встроены в командный процесс и ролевую структуру. Ниже — что именно меняется. Этот блок адресован прежде всего руководителям.
Product Owner и аналитик как авторы спецификации. В классическом процессе PO пишет пользовательские истории и «спихивает» их разработке; приёмка происходит в конце. В ATDD PO/аналитик — соавтор исполняемой спецификации: он участвует в фазе «Обсуди», приводит примеры, отвечает на вопросы разработчиков прямо во время написания тестов. Это меняет нагрузку: работа PO смещается с «написания историй» на «ведения диалога через примеры», и без готовности к этой роли ATDD не взлетает.
Definition of Ready и Definition of Done. ATDD органично встраивается в эти артефакты Agile/Scrum. В DoR появляется пункт «есть совместно написанные приёмочные тесты» (фича не берётся в спринт без них). В DoD — «все приёмочные тесты зелёные» (фича не считается готовой с красной спецификацией). Это превращает ATDD из «хорошей практики» в формальный gate процесса, что критично для устойчивости.
Планирование спринта через готовые спецификации. Когда приёмочные тесты написаны на фазе планирования, оценка фичи становится точнее: команда оценивает не абстрактную историю, а конкретный набор примеров и видно объём работы. Это снижает разброс оценок и уменьшает количество «сюрпризов» посреди спринта. Обратная сторона — фаза планирования удлиняется; для команд, не готовых инвестировать в неё, это ощущается как замедление.
Связка с ручным QA. Роль QA смещается от «прогона сценариев вручную» к проектированию приёмочных тестов и исследовательскому тестированию. Регрессия на уровне приёмки страхуется автоматически; ручное QA концентрируется на том, чего автоматизация не покрывает (исследовательские сессии, эвристики, UX). Это разгружает QA от рутины и поднимает ценность роли. Подробнее о месте автоматизации и ручного тестирования — в пирамиде тестирования.
Живая документация как побочный продукт. Набор зелёных приёмочных тестов читается как спецификация системы. Новому разработчику или приходящему аналитику проще понять «что система реально делает», читая тесты, а не устаревший Confluence. Это снижает порог входа и косвенно повышает bus-factor проекта.
Синергия с непрерывной интеграцией. Приёмочные тесты запускаются на каждой сборке в CI. Если они медленные (об этом — в рисках), их разбивают на уровни: быстрые приёмочные тесты на каждом коммите, полный приёмочный набор — на ночном билде. Это та же логика слоистости, что и в пирамиде тестирования.
Преимущества
Однозначные требования. Совместно написанные примеры устраняют трактовки. Спор о том, «что имел в виду заказчик», разрешается не возвратом к документу двухмесячной давности, а перечитыванием согласованной спецификации.
Ранний консенсус. Неоднозначности ловятся на фазе «Обсуди» — за столом, до кода. Это самое дешёвое место для исправления недопонимания; по мере движения к коду и далее стоимость правки растёт на порядки.
Исполняемая спецификация. Договорённости не просто записаны — они исполняются на каждой сборке. Если поведение системы расходится со спецификацией, это обнаруживается автоматически, а не в момент демо.
Снижение дефектов приёмки. Дефекты вида «не то, что просили» — самые дорогие, потому что их правка часто означает переделку целой фичи. ATDD систематически вылавливает их до кода. Качественный эффект (подтверждаемый отчётами Аджича по десяткам команд): дефектов приёмки меньше, а их средняя стоимость — ниже.
Живая документация. Зелёный набор приёмочных тестов — документация, которая не врёт. Это ценный актив для онбординга, аудита и передачи знаний между командами.
Мост между бизнесом и разработкой. Язык примеров понятен нетехническим стейкхолдерам (таблицы «вход → выход» читает любой заказчик). Это сокращает дистанцию между требованиями и реализацией и делает ревью приёмки осмысленным для бизнеса.
Недостатки и риски
Медленные e2e-приёмочные тесты. Если приёмочные тесты реализованы как полноценные end-to-end сценарии через UI, они медленные и хрупкие (flaky). Набор из сотен таких тестов превращает пайплайн в многочасовую очередь и подрывает доверие к спецификации. Решение — слоистость (быстрые приёмочные на уровне API/домена, e2e — точечно), но это требует инженерной зрелости. Подробнее — в пирамиде тестирования.
Накладные поддержания. Набор приёмочных тестов — это кодовая база, которую нужно поддерживать наравне с production-кодом: менять при эволюции требований, чинить хрупкие, обновлять fixture-ы. Команда без ресурса на это поддержку получает за год «зоопарк» тестов, из которого половина не запускается.
Вырождение в «тесты ради тестов». Если фаза «Обсуди» формальна (PO прислал примеры по почте, команда их формализовала без диалога), приёмочные тесты превращаются в ещё один слой рутины без раннего консенсуса. Симптом — тесты зелёные, а заказчик всё равно «не то имел в виду». Это означает, что ATDD выродился в автотесты без сути.
Зависимость от вовлечённости бизнеса. ATDD требует живого участия PO/заказчика на фазе планирования. Если бизнес «не имеет времени» и скидывает требования текстом, методология не работает: совместного написания нет, раннего консенсуса нет. Это предусловие, а не пожелание — и частый реальный барьер.
Риск тестирования реализации, а не поведения. Если приёмочные тесты привязаны к деталям реализации (конкретным UI-элементам, структуре БД), они ломаются при любом рефакторинге и перестают быть живой документацией. Граница между тестированием поведения и реализации тонка и требует навыка.
Не ускоряет первый коммит. Как и TDD, ATDD ощутимо удлиняет путь от «есть идея» до «первый зелёный пайплайн». Оплата — в долгую (меньше переделок), но руководитель, оценивающий по скорости первых спринтов, получит ложную картину «торможения».
Когда использовать
- Продуктовая разработка с активным заказчиком. Есть PO/аналитик, готовый участвовать в написании примеров, и заказчик, доступный для диалога — главный сценарий применимости ATDD.
- Сложные приёмочные сценарии. Много правил, ветвлений, граничных случаев — там, где абстрактные требования неизбежно трактуются по-разному; примеры дают однозначность.
- Регуляторные требования к приёмке. Домены, где приёмка формальна и должна быть задокументирована (финансы, медицина, гос) — исполняемая спецификация даёт аудируемый след «что именно проверено».
- Зрелая инженерная культура с CI. Приёмочные тесты должны запускаться автоматически на каждой сборке; без CI их ценность резко падает.
- Команда, готовая инвестировать в планирование. Фаза «Обсуди + Дистиллируй» занимает время; команды, привыкшие «бросаться в код», должны быть готовы к смене ритма.
- Долгоживущий продукт. Инвестиция в живую документацию окупается на горизонте месяцев и лет; для одноразовых прототипов — почти никогда.
Когда НЕ использовать
- Exploratory-разработка и исследования. Когда заранее неизвестно, что именно должно получиться, фиксировать приёмку преждевременно — спецификация будет переписываться вслед за меняющимся пониманием. Здесь работают практики исследовательского тестирования и коротких экспериментов.
- Нет вовлечённого заказчика/PO. Без соавтора со стороны бизнеса фаза «Обсуди» пуста; ATDD превращается в автотесты, написанные разработчиками в одиночку, без раннего консенсуса.
- Чисто инфраструктурные задачи. CI/CD-пайплайны, миграции, инфраструктурный код — там, где нет «пользовательской функциональности» в смысле приёмки, ATDD плохо ложится; здесь работают TDD и инфраструктурное тестирование.
- Команда без навыка автоматизации. Если команда не умеет писать поддерживаемые приёмочные тесты, первая попытка даёт хрупкий e2e-зоопарк и разочарование. Сначала — обучение и пилот; потом — масштабирование.
- Жёсткие дедлайны с паникой. В режиме deadline-driven фаза совместного планирования отбрасывается первой; ATDD в таком окружении не приживается, пока не устранена первопричина.
Связанные подходы
ATDD — не единственный «*DD» в разработке; за разными аббревиатурами стоят разные «движущие силы». Статья входит в серию материалов о driven-подходах; ниже — краткая карта, со ссылками на уже опубликованные материалы базы знаний.
Разведение TDD / ATDD / BDD
TDD, ATDD и BDD часто путают, потому что все три «пишут тесты до кода». Разница — в уровне, драйвере и главном вопросе.
| Ось сравнения | TDD | ATDD (этот материал) | BDD |
|---|---|---|---|
| Уровень | Юнит кода (функция, класс) | Пользовательская функциональность (фича) | Поведение фичи в сценариях |
| Драйвер | Дизайн кода (тестируемость) | Критерии приёмки | Общий язык и понимание поведения |
| Главный вопрос | «Хорошо ли написан код?» | «Выполнены ли критерии приёмки?» | «О чём мы договорились как о поведении?» |
| Формат теста | Произвольный (xUnit, etc.) | Произвольный (таблицы, сценарии, DSL) | Given-When-Then (Gherkin) |
| Кто пишет | Разработчик | Вся команда + заказчик | Вся команда + заказчик (Three Amigos) |
| Инструменты | JUnit, pytest, Jest | FitNesse, Robot Framework, SpecFlow | Cucumber, JBehave, SpecFlow |
| Выход | Чистый код + юнит-тесты | Исполняемая спецификация приёмки | Живая спецификация поведения на общем языке |
Иначе говоря, на вопрос «что драйвит?» три подхода отвечают по-разному: TDD — дизайн кода, ATDD — приёмку фичи, BDD — понимание поведения через диалог. Они не конкурируют, а дополняют друг друга по уровням: BDD задаёт приёмочное поведение сверху, TDD страхует код снизу; ATDD исторически занимает промежуточное положение и во многом слился с BDD в современной трактовке. В зрелой кодовой базе все три сосуществуют, и именно их сочетание даёт когерентную культуру «поведение → требования → код → проверка».
Карта серии
- TDD — Test Driven Development — родственный подход, где движущей силой выступают тесты как исполняемая спецификация. ATDD и TDD не конкурируют, а дополняют друг друга: ATDD задаёт рамку «что строим» на уровне фичи, TDD страхует реализацию на уровне юнитов.
- BDD — Behaviour Driven Development — прямой потомок ATDD: BDD = ATDD + фокус на общий язык (Given-When-Then) и коммуникацию. ATDD шире по форме (любой исполняемый формат приёмочного теста), BDD строже по синтаксису и сильнее смещён в диалог бизнеса и разработки.
- DDD — Domain Driven Design — родственный подход, где движущей силой выступает домен. DDD задаёт общий язык и модель предметной области; ATDD пользуется этим языком при формулировке примеров приёмки.
- FDD — Feature Driven Development — организационная методология, где движущей силой выступает клиенто-ориентированная фича. FDD задаёт процесс доставки фичи, ATDD — её приёмку; на практике они сочетаемы.
- MDD — Model Driven Development — модельно-ориентированный подход; концептуально дальше от ATDD, но разделяет идею «исполняемого артефакта как источника истины» (модель у MDD, спецификация-пример у ATDD).
- XP — Extreme Programming — методология, в которой ATDD родился как практика приёмочного тестирования силами заказчика.
- Agile и Scrum — процессные рамки, в которые ATDD встраивается через Definition of Ready / Definition of Done.
- Acceptance testing — приёмочное тестирование как практика, которую ATDD поднимает на уровень спецификации.
- Введение в тестирование и пирамида тестирования — место приёмочных тестов в общей системе контроля качества.
- Политика нуля дефектов — работа с найденными дефектами приёмки в кодовой базе, где спецификация исполняема.
Родственные driven-подходы — TDD, BDD, DDD, FDD, MDD, а также «сатирические» варианты вроде Panic Driven Development — рассматриваются в соответствующих статьях серии.
Краткий вердикт для руководителя
ATDD — это инвестиция в раннюю договорённость, а не способ ускорить написание кода. Эффект: однозначные требования, исполняемая спецификация, меньше дефектов приёмки, живая документация, мост между бизнесом и разработкой. Цена: удлинённая фаза планирования, необходимость поддерживать набор приёмочных тестов, критическая зависимость от вовлечённости PO/заказчика. Берите, если у вас активный заказчик, сложные приёмочные сценарии и зрелый CI; фреймворк органично встраивается в DoR/DoD и культуру Agile. Не берите, если заказчика достучаться невозможно, продукт — чистая инфраструктура, или команда ещё не освоила автоматизацию. И помните: в современной трактовке ATDD во многом слился с BDD — если вам ближе строгий формат Given-When-Then и фокус на общем языке, выбирайте BDD; если формат примеров произволен и важна именно приёмка — ATDD.
Источники и материалы
Первоисточники и ключевые публикации
- Lisa Crispin, Tip House. Testing Extreme Programming. Addison-Wesley, 2003 — первая систематизация приёмочного тестирования как полноправной части XP-процесса.
- Gojko Adžić. Specification by Example: How Successful Teams Deliver the Right Software. Manning, 2011 — каноническое обобщение опыта десятков команд; паттерны совместного написания спецификаций через примеры.
- Gojko Adžić. Bridging the Communication Gap. Neuri, 2009 — предтеча Specification by Example; коммуникация бизнеса и разработки через исполняемые примеры.
- Ken Pugh. Lean-Agile Acceptance Test-Driven Development: Better Software Through Collaboration. Addison-Wesley, 2010 — операционное описание ATDD в Lean-Agile контексте.
- Dan North. Introducing BDD (Better Software, 2006) — статья, где North ввёл ATDD/BDD как ответ на проблемы коммуникации; помогает понять исторический переход.
- Ward Cunningham. Fit (2002) — первый массовый инструмент ATDD; таблицы как исполняемые спецификации.
Связанные материалы базы знаний
- TDD — Test Driven Development — ATDD и TDD дополняют друг друга по уровням.
- BDD — Behaviour Driven Development — прямой потомок ATDD с фокусом на общий язык.
- DDD — Domain Driven Design — общий язык домена, используемый в примерах приёмки.
- XP — Extreme Programming — методология, в которой ATDD родился.
- Agile и Scrum — процессные рамки для встраивания ATDD через DoR/DoD.
- Acceptance testing — практика, которую ATDD поднимает на уровень спецификации.
- Пирамида тестирования и введение в тестирование — место приёмочных тестов в общей картине качества.