## Контекст
- финтех и производство
- enterprise платформы и системы
- inhouse разработка
- интеграция
---
### Без тестов
- большинство inhouse проектов
- началось как утилита, а теперь уже > 200k LOC
---
### Итнересный кейс :)
At ASML, when you want to fix a bug, you first describe the bugfix in a Word document. This goes to various risk assessment managers. They assess whether fixing the bug might generate a regression elsewhere. There's no tests, remember, so they do _educated guesses_ whether the bugfix is too risky or not. If they think not, then you get a go to manually apply the fix in 6+ product families. Without automated tests.
\- https://news.ycombinator.com/item?id=18442637
---
## Зачем
- Закрепить ожидаемое поведение системы
- Проверить поведение на соответствие ожиданиям
- Избежать регресса при внесении изменений
---
## Что
- Общее поведение системы
- интеграционные тесты
- приемочные (acceptance) тесты
- Низкоуровневые составляющие
- минимальная/малая единица поведения: unit тесты
---
## Когда
- При внесении изменений
- В код
- В конфигурацию (использование в новой среде)
---
## Итеративная командная разработка
- Каждый выполняет свою задачу в отдельной ветке репозитория (или в иерархии веток)
- Выполненные задачи накапливаются в отдельной ветке репозитория (develop, preprod, master,
в зависимости от принятого flow)
- В час "Ч" из этой ветки собирается релиз/деплой
---
## Две ключевые точки контроля
- после завершения задачи/фикса
- результат соответствует требованиям? (acceptance)
- перед деплоем/релизом
- ничего не сломалось при накоплении изменений? (integration)
---
## Форма теста
- спецификация ожиданий в любом виде
- код
- протокол тестирования
- user story/use case
из текстовых описаний QA по мере необходимости делает скрипты
---
## В контексте CI/CD
Для CI/CD необходим высокий уровень автоматизации
- управления инфраструктурой и конфигурацией
- мониторинга и оповещения
**Интергационное тестирование обязательно**
---
## В контексте CI/CD
**Интергационное тестирование обязательно**
Но не обязательно автоматизированное :)
---
### Влияние тестов на качество системы (по моему опыту)
- юнит тесты - далеко не всегда
- интеграционные/acceptance тесты - значительно
- не обязательно автоматизированные
- чем больше проект, тем сильнее влияние
* верификаторы кода - в каком-то одном аспекте (зависит от квалификации команды), как и линтеры
---
## Экзотика (и не очень)
- Formal Verification (напр JML)
- Property-Based Testing
- Static code analyzers
---
## TDD
При использовании TDD имеем:
- дисциплина мышления
- сначала думаем, потом делаем
- сначала формулируем API и ожидания от
- минимальной функциональной единицы (unit test)
- подсистемы/модуля (ассеptance test)
---
## TDD
- четкий процесс с малыми шагами
- уверенность при внесении изменений
- можно сфокусироваться на малой части функционала не беспокоясь о побочных эффектах)
- эволюция кода (код непрерывно рефакторится под новые тесты)
---
## НО
- подходит не всем и не всегда
- может быть медленнее
- требует дисциплины
- при плохом проектировании
- каскады ошибок в 1000е тестов
- очень легко превратить редизайн (API, структуры) в АД
---
# Автоматизируйте всё!
И time-to-market будет измеряться в часах
{"metaMigratedAt":"2023-06-17T11:47:43.752Z","metaMigratedFrom":"Content","title":"Автоматизируйте всё!","breaks":true,"contributors":"[{\"id\":\"584680c0-e775-4ea9-aa2b-abc0982ead8d\",\"add\":4298,\"del\":1014}]"}