Unit-тесты и интеграционные тесты — это два основных типа тестов, которые используются в разработке программного обеспечения. Они имеют разные цели, охватывают разные аспекты системы и требуют разных подходов к реализации. Давайте разберем их основные различия.
Unit-тесты предназначены для проверки корректности работы отдельных единиц кода (например, методов или классов) в изоляции от других частей системы. Они фокусируются на внутренней логике и поведении конкретного компонента.
Unit-тесты выполняются очень быстро, так как они не зависят от внешних систем и работают в изоляции.
Рассмотрим пример unit-теста для класса Calculator
, который складывает два числа.
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
int result = calculator.add(2, 3);
assertEquals(5, result, "2 + 3 should equal 5");
}
}
Calculator
.add
. Здесь тестируется только логика сложения двух чисел.Интеграционные тесты проверяют, как разные компоненты системы взаимодействуют друг с другом. Они фокусируются на интеграции между модулями, базами данных, внешними сервисами и другими частями системы.
Интеграционные тесты выполняются медленнее, чем unit-тесты, так как они зависят от внешних систем и требуют их настройки.
Рассмотрим пример интеграционного теста для сервиса UserService
, который взаимодействует с базой данных.
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
@TestPropertySource(locations = "classpath:test.properties")
public class UserServiceIntegrationTest {
@Autowired
private UserService userService;
@Autowired
private UserRepository userRepository;
@Test
public void testCreateUser() {
User user = new User("John", "Doe");
userService.createUser(user);
User savedUser = userRepository.findById(user.getId()).orElseThrow();
assertEquals("John", savedUser.getFirstName());
assertEquals("Doe", savedUser.getLastName());
}
}
UserService
.createUser
корректно сохраняет пользователя в базе данных.UserRepository
и база данных).Характеристика | Unit-тесты | Интеграционные тесты |
---|---|---|
Цель | Проверка логики одного компонента | Проверка взаимодействия компонентов |
Область тестирования | Один класс или метод | Несколько компонентов |
Зависимости | Моки и стабы | Реальные зависимости |
Скорость выполнения | Быстро | Медленно |
Сложность настройки | Низкая | Высокая |
Частота выполнения | Часто (при каждом изменении кода) | Реже (перед релизом или деплоем) |
Оба типа тестов важны для обеспечения качества кода. Unit-те