August 10th, 2020

404

Программистская бытовая мудрость

Когда "написал, а оно не работает", то есть несколько ситуаций:
1. Опечатки и нелепые баги (не то число агрументов в функции и т.д.)
2. Оно сломалось там, где не ожидали (модуль не той версии, сервер не доступен и т.д.)
3. Какая-то фигня в коде.

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

Существует некая фашистская максима, что вся разработка должна идти в red-green для юнит-тестов и т.д. Когда на каждую строчку реального кода целый бойлерплейт тестов. Так, иногда, имеет смысл делать, если это разработка чего-то, что будет сильно сложным и важным.

IRL можно срезать углы. Интеграционные тесты захватывают приличный кусок кода, и если там тривиальный алгоритм вида "взяли, передали в другое место с другим набором параметров", а потом это в третье место передали и вернули результат, то юнит-тесты тут - игра в моки во имя моков.

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

//Всё вышенаписанное касается условно-тривиального кода, в который иногда врываются простейшие алгоритмы. Если вы пишите плотный код с алгоритмами (синтаксический анализатор, 3D-рендер, etc) - тут уже совсем другие подходы к разработке.