Пишу следующие виды тестов:
- Unit-тесты: Тестируют отдельные компоненты или методы класса изолированно от остальной системы. Использую JUnit или TestNG. Для мокирования зависимостей — Mockito.
- Integration-тесты: Тестируют взаимодействие между несколькими компонентами, подсистемами или сервисами. Например, взаимодействие с базой данных или внешним API. Использую Spring Boot Test для тестирования Spring-приложений, Testcontainers для тестирования с реальными зависимостями (базы данных, месседж-брокеры).
- Component-тесты / End-to-End (E2E) тесты: Тестируют систему с точки зрения пользователя от начала до конца. Чаще всего автоматизированные тесты пользовательского интерфейса или API. Для API использую Rest-Assured. Для UI — Selenium (хотя предпочитаю писать API-тесты, так как они более стабильны и быстрее).
Процесс написания тестов:
- Выбор фреймворка: JUnit 5 или TestNG для unit-тестов, Spring Boot Test, Rest-Assured, Testcontainers для интеграционных и компонентных тестов.
- Написание тестов до или в процессе написания кода: Использую TDD (Test-Driven Development) или пишу тесты сразу после написания функциональности.
- Изоляция тестов: Для unit-тестов использую Mockito для мокирования зависимостей, чтобы тестировать только изолированный компонент.
- Структура теста: Обычно придерживаюсь структуры Arrange-Act-Assert (Подготовка данных, Выполнение действия, Проверка результата).
- Четкое именование тестов: Названия тестов должны ясно описывать, что именно тестируется и при каких условиях. Например,
userService_createUser_shouldSaveUserInDatabase
.
- Тестирование граничных условий и ошибок: Проверяю как нормальные сценарии, так и случаи с некорректными входными данными, исключениями и граничными значениями.
- Рефакторинг тестов: Поддерживаю тесты в чистоте и читаемости так же, как и основной код.
Пример unit-теста с Mockito и JUnit 5:
java