Назад к вопросам
Middle
68
questionbank
Какие тесты вы пишете и каким образом?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Я пишу следующие виды тестов:
-
Модульные тесты (Unit Tests):
- Тестируют отдельные классы или методы в изоляции.
- Использую JUnit или TestNG.
- Применяю Mockito для создания моков и заглушек зависимостей.
- Фокусируюсь на покрытии логики метода.
- Обычно один тестовый класс для каждого тестируемого класса.
// Пример модульного теста с JUnit и Mockito import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; class MyServiceTest { @Test void testProcessData() { // Мокаем зависимость MyDependency mockDependency = mock(MyDependency.class); when(mockDependency.getData()).thenReturn("test data"); // Создаем экземпляр тестируемого класса с моком MyService myService = new MyService(mockDependency); // Вызываем тестируемый метод String result = myService.processData(); // Проверяем результат assertEquals("PROCESSED: test data", result); // Проверяем взаимодействие с моком verify(mockDependency, times(1)).getData(); } } -
Интеграционные тесты (Integration Tests):
- Тестируют взаимодействие между несколькими компонентами или сервисами.
- Использую Spring Boot Test для тестирования контроллеров, сервисов и интеграции с базами данных.
- Могу использовать Testcontainers для запуска зависимых сервисов (базы данных, брокеры сообщений) в контейнерах Docker.
- Менее детализированы, чем модульные тесты.
- Фокусируюсь на корректности передачи данных и вызовов между компонентами.
// Пример интеграционного теста с Spring Boot Test import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.http.ResponseEntity; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.springframework.http.HttpStatus.OK; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class MyControllerIntegrationTest { @Autowired private TestRestTemplate restTemplate; @Test void testEndpoint() { // Вызываем REST эндпоинт ResponseEntity<String> response = restTemplate.getForEntity("/my-endpoint", String.class); // Проверяем HTTP статус и тело ответа assertEquals(OK, response.getStatusCode()); assertEquals("Success!", response.getBody()); } } -
Функциональные/Приемочные тесты (Functional/Acceptance Tests):
- Тестируют функциональность приложения с точки зрения пользователя.
- Могут использовать различные фреймворки в зависимости от типа приложения (например, Selenium для веб-приложений, Rest-Assured для API).
- Ориентированы на выполнение пользовательских сценариев.
- Тестируют «черный ящик».
Способы и практики:
-
TDD (Test-Driven Development):
- Сначала пишу тест, который падает.
- Затем пишу минимальный код, чтобы тест прошел.
- Рефакторю код и тесты.
- Практикую TDD, когда это возможно и целесообразно.
-
Покрытие кода:
- Слежу за покрытием кода тестами, используя инструменты типа JaCoCo.
- Стремлюсь к высокому покрытию, но не гонюсь за 100%, так как это не всегда оправдано.
-
Чистые тесты:
- Применяю принципы F.I.I.R.S.T. (Fast, Isolated, Repeatable, Self-validating, Timely) к написанию тестов.
- Тесты должны быть читаемыми и легко поддерживаемыми.
-
Автоматизация:
- Встраиваю выполнение тестов в CI/CD пайплайн.
- Тесты запускаются автоматически при каждой сборке или пулле изменений.