Сейчас будет статья про взрослые подходы в разработке. Она будет полезна тем, кто хочет работать в крупных компаниях и больших разработческих командах.
Обычная разработка выглядит так: пишем код → тестируем → смотрим, что не прошло, и исправляем код. И так повторяем до тех пор, пока все тесты не сработают. Разработка через тестирование — это обратный подход.
Коротко суть TDD (test-driven development)
Разработка через тестирование — это подход, при котором тесты создаются раньше кода. Вот так:
- Перед тем как писать код, программисты задают для себя критерии рабочего кода. Например, какой-то модуль программы при запросе «Прачечная» должен гарантированно отвечать «Министерство культуры».
- Программист сразу пишет тест «Запрос такой-то — ожидать ответ такой-то».
- Так как требований и кейсов к модулю может быть много, тестов тоже получается целая батарея.
- Дальше пишется код этого модуля.
- Как только код готов, включают батарею тестов и смотрят, чтобы они прошли корректно.
- Так повторяется для каждого модуля, каждого маленького закутка, и при каждом обновлении программы прогоняются все тесты.
Так как тестов много и они пишутся заранее, они сохраняются в проекте по мере разработки. И когда у тебя не один, а 10 модулей, то они тоже все обвешаны тестами. И если ты поменял что-то в 9-м модуле, что сломало 1-й модуль, ты об этом узнаешь благодаря тестам.
Со звёздочкой. Есть ещё разработка через поведение. Там идея такая: мы тестируем не конкретные вводы-выводы данных, а более общие возможности кода — что он должен уметь делать в разных ситуациях. Для этого пользуются специальными скриптовыми языками, которые похожи на обычный язык.
Если код проходит тесты, это автоматически означает, что его можно выкатывать для всех пользователей.
Плюсы и минусы TDD (Test-driven development)
Плюсы разработки через тестирование:
- Более высокое качество кода. То, что каждый код проходит через серию тестов — это уже дисциплинирует само по себе.
- Улучшенная модульность. Каждый компонент тестируется сам по себе, при этом программисты исходят из того, что модули должны уметь работать друг с другом.
- Быстрое обновление. Код уже оттестирован внутри, поэтому отдельный этап тестирования всего софта целиком занимает меньше времени. Иногда вообще не тестируют, сразу отдают пользователю.
- Улучшенное понимание кода. Каждый тест — это одновременно и документация к функциям, а это помогает всем лучше понять, что именно делает программа.
Минусы такого подхода:
- Нужно больше времени на написание кода и тестов.
- Для хороших тестов нужен большой опыт. Если программист не умеет писать нормальные тесты, то смысла в таком тестировании не сильно много.
- Некоторые тесты сложно написать. Например, тестирование графического интерфейса автоматизировать сложно.
Разработка через поведение (BDD)
Кроме разработки через тестирование, есть разработка через поведение, или BDD (Behavior-driven development). Здесь мы смотрим не на ввод-вывод данных, а на поведение программы: как с ней взаимодействует пользователь и что она ему выдаёт.
В поведенческом подходе тесты пишут в формате Given-When-Then (Дано — Когда — Тогда), чтобы сразу привязать код к логике работы проекта. Пример теста BDD:
Scenario: Клиент должен быть авторизован, чтобы иметь доступ к личному кабинету
Given пользователь открывает личный кабинет
When пользователь не авторизован
Then отображаем отказ
Что дальше
В следующий раз мы познакомимся с BDD-сценариями поближе: посмотрим на инструменты и попробуем написать сценарий к какому-нибудь нашему проекту.