Назад к вопросам
Middle
81
questionbank
Какие типы тестов вы пишете и каким образом?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Пишу следующие типы тестов:
- Unit-тесты: Тестируют отдельные компоненты (классы, методы) в изоляции. Использую JUnit или TestNG, моки с Mockito.
- Integration-тесты: Проверяют взаимодействие между несколькими компонентами или подсистемами (например, сервис с базой данных). Часто использую Spring Boot Test и Testcontainers.
- Component-тесты: Тесты, покрывающие функциональность отдельного компонента системы в целом, включая его взаимодействие с внешними зависимостями (часто мокированными).
- End-to-End (E2E) тесты: Проверяют полную работу всей системы от начала до конца, имитируя действия пользователя. Могут использовать Selenium, Cypress (для веб).
Процесс написания тестов:
- Понимание требований: Четко определить, что именно должен делать тестируемый код.
- Выбор типа теста: Определить, какой тип теста наиболее подходит для данной функциональности (Unit, Integration и т.д.).
- Настройка тестового окружения: Подготовить необходимые зависимости, моки, тестовые данные.
- Написание тестового сценария: Определить последовательность действий и ожидаемый результат.
- Написание кода теста: Реализовать тестовый сценарий с использованием выбранного фреймворка.
- Запуск теста: Выполнить тест и убедиться в его успешном прохождении.
- Рефакторинг теста: Улучшить читаемость и поддерживаемость теста при необходимости.
Пример 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());
}
}