Назад к вопросам
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 пайплайн.
    • Тесты запускаются автоматически при каждой сборке или пулле изменений.