TDD, test-driven development или процесс разработки через тестирование — это методология разработки программного обеспечения, которая основывается на повторении коротких циклов разработки: изначально пишется тест, покрывающий желаемое изменение, затем пишется программный код, который реализует желаемое поведение системы и позволит пройти написанный тест, а затем проводится рефакторинг написанного кода с постоянной проверкой прохождения всех тестов.

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

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

Цикл разработки по TDD

  • Добавить тест для новой (еще не реализованной) функциональности или для воспроизведения существующего бага
  • Запустить все тесты и убедиться, что новый тест не проходит
  • Написать код, который обеспечит прохождение теста: 
  • Запустить тесты и убедиться, что они все прошли успешно: прохождение нового теста подтверждает реализацию нового функционала или исправление существующей ошибки, а прохождение остальных позволяет удостовериться, что ранее реализованный функционал работает по-прежнему корректно. 
  • Заняться рефакторингом и оптимизацией — улучшение сопровождаемости и быстродействия целесообразно осуществлять уже после того, как получилось добиться проверяемой работоспособности
  • Перезапустить тесты и убедиться, что они все ещё проходят успешно
  • Повторить цикл

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

Архитектура программных продуктов, разрабатываемых таким образом, обычно лучше (в приложениях, которые пригодны для автоматического тестирования, обычно очень хорошо распределяется ответственность между компонентами, а выполняемые сложные процедуры декомпозированы на множество простых). Стабильность работы приложения, разработанного через тестирование, также выше за счёт того, что все основные функциональные возможноси программы покрыты тестами и их работоспособность постоянно проверяется. Сопровождаемость проектов, где тестируется всё или практически всё, очень высока — разработчики могут не бояться вносить изменения в код, если что-то пойдёт не так, то об этом сообщат результаты автоматического тестирования.

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

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

Разрабатываем сайты любой сложности, интернет-магазины и веб-приложения для автоматизации бизнеса.

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

Узнать больше →

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

Мы разрабатываем сложные сайты и веб-приложения на фреймворке Ruby on Rails.

Коробочные CMS не подходят для нестандартных сайтов или при наличии действительно высоких требований к быстродействию и устойчивости к нагрузкам. В этих случаях в качестве платформы для разработки выбирается фреймворк Ruby on Rails.

Если ваш проект требует реализации сложной бизнес-логики, должен работать быстро и быть рассчитан под высокие нагрузки, то Ruby on Rails в качестве платформы для разработки — это хороший выбор.

Узнать больше →

Мы специализируемся на разработке сложных проектов на Ruby on Rails и обладаем многолетним опытом в этом направлении. Разработка на Rails — отличный выбор для проектов со сложной бизнес-логикой и высокими требованиями к безопасности, надёжности и производительности.

Cтатьи по теме:

REST и RESTful — передача репрезентативного состояния и ресурсный роутинг
REST — это стиль построения архитектуры распределенного клиент-серверного приложения, который упрощает роутинг и построение API.
Парадигма MVC — модель-представление-контроллер
MVC или модель-представление-контроллер — это паттерн проектирования веб-приложений, который включает в себя несколько более мелких шаблонов. При использовании MVC модель данных приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента, благодаря чему модификация одного из них оказывает минимальное воздействие на остальные или не оказывает его вовсе.
Стандарты кодирования — залог хорошей сопровождаемости проекта
Любая командная разработка может быть эффективной только в том случае, если участники команды имеют общее видение. Иначе разработка начинает напоминать басню Крылова «Лебедь, Щука и Рак».
SOLID — принципы объектно-ориентированного программирования
SOLID это аббревиатура пяти основных принципов проектирования в объектно-ориентированном программировании — Single responsibility, Open-closed, Liskov substitution, Interface segregation и Dependency inversion. В переводе на русский: принцип единственной ответственности, принцип открытости / закрытости, принцип подстановки Барбары Лисков, принцип разделения интерфейса и принцип инверсии зависимостей.
Принцип программирования YAGNI — «Вам это не понадобится»
Если упрощенно, то следование данному принципу заключается в том, что возможности, которые не описаны в требованиях к системе, просто не должны реализовываться. Это позволяет вести разработку, руководствуясь экономическими критериями — Заказчик не должен оплачивать ненужные ему функции, а разработчики не должны тратить своё оплачиваемое время на реализацию того, что не требуется.
Принцип программирования KISS — делайте вещи проще
Большая часть программных систем необосновано перегружена практически ненужными функциями, что ухудшает удобство их использование конечными пользователями, а также усложняет их поддержку и развитие разработчиками. Следование принципу «KISS» позволяет разрабатывать решения, которые просты в использовании и в сопровождении.
Принцип программирования DRY — don’t repeat yourself / не повторяйте себя
Следование принципу программирования «DRY» позволяет добиться высокой сопровождаемости проекта: простоты внесения изменений и качественного тестирования.

Тематические технологии:

Язык программирования Ruby
Фреймворк Ruby on Rails
PostgreSQL — объектно-реляционная СУБД
Поисковая система ElasticSearch
СУБД Redis
Язык программирования Go
Язык программирования Python
Язык разметки HTML
CSS — каскадные таблицы стилей
Язык программирования JavaScript
Библиотека React
Библиотека MobX
Библиотека MobX State Tree
Система сборки WebPack
Платформа NodeJS
Red Hat Enterprise Linux