Назад к вопросам
Middle
81
questionbank

Какие типы тестов вы пишете и каким образом?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Пишу следующие типы тестов:

  • Unit-тесты: Тестируют отдельные компоненты (классы, методы) в изоляции. Использую JUnit или TestNG, моки с Mockito.
  • Integration-тесты: Проверяют взаимодействие между несколькими компонентами или подсистемами (например, сервис с базой данных). Часто использую Spring Boot Test и Testcontainers.
  • Component-тесты: Тесты, покрывающие функциональность отдельного компонента системы в целом, включая его взаимодействие с внешними зависимостями (часто мокированными).
  • End-to-End (E2E) тесты: Проверяют полную работу всей системы от начала до конца, имитируя действия пользователя. Могут использовать Selenium, Cypress (для веб).

Процесс написания тестов:

  1. Понимание требований: Четко определить, что именно должен делать тестируемый код.
  2. Выбор типа теста: Определить, какой тип теста наиболее подходит для данной функциональности (Unit, Integration и т.д.).
  3. Настройка тестового окружения: Подготовить необходимые зависимости, моки, тестовые данные.
  4. Написание тестового сценария: Определить последовательность действий и ожидаемый результат.
  5. Написание кода теста: Реализовать тестовый сценарий с использованием выбранного фреймворка.
  6. Запуск теста: Выполнить тест и убедиться в его успешном прохождении.
  7. Рефакторинг теста: Улучшить читаемость и поддерживаемость теста при необходимости.

Пример Unit-теста с Mockito:

// Импорты опущены для краткости

public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    void testGetUserById_Success() {
        // Подготовка данных
        long userId = 1L;
        User mockUser = new User(userId, "testuser");
        when(userRepository.findById(userId)).thenReturn(Optional.of(mockUser));

        // Выполнение тестируемого метода
        Optional<User> result = userService.getUserById(userId);

        // Проверка результата
        assertTrue(result.isPresent());
        assertEquals("testuser", result.get().getUsername());
        verify(userRepository, times(1)).findById(userId); // Проверка, что метод репозитория был вызван один раз
    }

    @Test
    void testGetUserById_NotFound() {
        // Подготовка данных
        long userId = 2L;
        when(userRepository.findById(userId)).thenReturn(Optional.empty());

        // Выполнение тестируемого метода
        Optional<User> result = userService.getUserById(userId);

        // Проверка результата
        assertFalse(result.isPresent());
        verify(userRepository, times(1)).findById(userId);
    }
}

Пример Integration-теста с Spring Boot Test и Testcontainers:

// Импорты опущены для краткости

@SpringBootTest
@Testcontainers
public class UserRepositoryIntegrationTest {

    @Container
    private static PostgreSQLContainer<?> postgresContainer = new PostgreSQLContainer<>("postgres:13")
            .withDatabaseName("testdb")
            .withUsername("test")
            .withPassword("test");

    @Autowired
    private UserRepository userRepository;

    @DynamicPropertySource
    static void configureProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.datasource.url", postgresContainer::getJdbcUrl);
        registry.add("spring.datasource.username", postgresContainer::getUsername);
        registry.add("spring.datasource.password", postgresContainer::getPassword);
    }

    @Test
    void testSaveAndFindUser() {
        // Создание тестового пользователя
        User newUser = new User(null, "integration_user");

        // Сохранение пользователя
        User savedUser = userRepository.save(newUser);
        assertNotNull(savedUser.getId());

        // Поиск пользователя
        Optional<User> foundUserOptional = userRepository.findById(savedUser.getId());
        assertTrue(foundUserOptional.isPresent());
        User foundUser = foundUserOptional.get();
        assertEquals("integration_user", foundUser.getUsername());
    }
}