deep-dives

23 статьи

Назад ко всем статьям

Ваш компилятор проверяет синтаксис. Ваши тесты должны проверять архитектуру.

Большинство команд документирует правила архитектуры в вики. Вот как записать их в виде исполняемых тестов, которые ломают CI, когда ваш граф зависимостей уходит от задуманного.

Ваш доменный слой импортирует Postgres. Ваш CI всё равно.

Диаграммы чистой архитектуры отлично смотрятся на доске. Вот как заставить пайплайн сборки принудительно соблюдать направление зависимостей, чтобы доменный код не мог обращаться к инфраструктуре.

Ваша архитектурная диаграмма уже ложь

Архитектурная документация гниёт в тот момент, когда вы её сохраняете. Вот как поддерживать её в актуальном состоянии с помощью диаграмм, генерируемых из кода, ADR и автоматизированных архитектурных тестов.

Ваш цикл повторов предполагает, что первый запрос не удался. Скорее всего, это не так.

Таймаут или сбой не означают, что ваш API-запрос был потерян. Вот как ключи идемпотентности делают повторы безопасными, и как паттерн хранения на самом деле предотвращает дублирование.

У вашего веб-сервиса есть путь корректного завершения. Это и есть баг.

Crash-only софт обрабатывает каждый сбой как крах, а каждый запуск — как восстановление. Для веб-сервисов это означает удаление логики завершения и проектирование состояния, которое переживёт kill -9.

Как убить выжившего мутанта, когда вы не понимаете, что он изменил

Мутационное тестирование нашло выжившего, и вы понятия не имеете, что делает мутация. Вот пошаговый метод написания правильного теста без предварительного понимания мутанта.

Код аутентификации нуждается в 90% покрытии мутациями. Ваши строковые утилиты — нет.

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

Ваши тесты проходят. Mutation score — 40%. Вот что на самом деле говорят выжившие мутанты.

Code coverage говорит, что всё в порядке. Mutation testing говорит, что ваши тесты — в основном декорация. Вот как выжившие мутанты выявляют этот разрыв и как его устранить.

Мутационное тестирование занимает 4 часа. Как команды реально используют его в CI?

Большинство команд не запускают полные наборы мутационного тестирования на каждый коммит. Вот как инженерные команды реально интегрируют его в CI, не ломая пайплайн сборки.

100 прогонов — это ложь: как на самом деле определять размер property-based тестов

Стандартные 100 примеров в property-based testing — это социальный компромисс, а не статистическая стратегия. Вот как выбрать количество прогонов, соответствующее вашим потребностям в уверенности и бюджету CI.

Тесты на основе свойств в Rust находят баги, которые пропускают ваши юнит-тесты

Тестирование на примерах покрывает только те входные данные, о которых вы подумали. Тестирование на основе свойств генерирует случайные данные, проверяет инварианты и сокращает ошибки до минимальных контрпримеров.

Runtime contracts в Rust могут быть бесплатными в релизных сборках, но компилятор не сделает это за вас

Rust автоматически удаляет debug assertions, но настоящий design-by-contract требует большего, чем debug_assert!. Вот как построить zero-cost runtime contracts, которые исчезают из вашего релизного бинарника.

Ноль, один или двенадцать: сколько assertions нужно production-функции на самом деле

Разработчики либо разбрасывают assertions как конфетти, либо избегают их полностью. Вот фреймворк принятия решений, который отделяет полезные invariants от причин падения production.