İnteqrasiya Testləmə
İnteqrasiya testləmə müxtəlif komponentlərin düzgün birlikdə işlədiyini yoxlayır.
İnteqrasiya Testləmə Növləri
- Yuxarıdan aşağıya: Testləmə yüksək səviyyəli modullardan başlayır
- Aşağıdan yuxarıya: Testləmə aşağı səviyyəli modullardan başlayır
- Böyük partlayış: Bütün komponentlər eyni vaxtda inteqrasiya edilir
- Hibrid: Yuxarıdan aşağıya və aşağıdan yuxarıya yanaşmaları birləşdirir
İnteqrasiya Testləmə və Vahid Testləmə
| İnteqrasiya Testləmə | Vahid Testləmə |
|---|---|
| Komponentlər arası qarşılıqlı əlaqəni test edir | Ayrı komponentləri təcrid halında test edir |
| İnterfeys problemlərini müəyyən edir | Komponent funksionallığını yoxlayır |
| Daha yavaş icra | Sürətli icra |
| Daha çox quraşdırma tələb edir | Mock/stub-larla minimal quraşdırma |
| Həqiqi asılılıqları test edir | Asılılıqlar üçün test dublları istifadə edir |
Java Alətləri
- Spring Test: Spring tətbiqlərini testləmək
- REST-assured: RESTful API-ləri testləmək
- Testcontainers: Yüngül məlumat bazası/xidmət nümunələri
- Arquillian: Java EE tətbiqlərini testləmək
İnteqrasiya Testləmə Ən Yaxşı Təcrübələri
- Aydın sərhədlər müəyyən edin: Hər testə hansı komponentlərin daxil ediləcəyini müəyyən edin
- Test mühitlərindən istifadə edin: İnteqrasiya testləri üçün təcrid olunmuş mühitlər yaradın
- Test məlumatlarını idarə edin: Test məlumatlarının tutarlı və təcrid olunmuş olmasını təmin edin
- Xarici asılılıqları nəzarət edin: Xarici xidmətlər üçün konteyner və ya mock istifadə edin
- İnterfeysləri diqqət mərkəzinə alın: Komponentlər arası müqavilələri test edin
- Quraşdırma və təmizləməni avtomatlaşdırın: Testlərdən əvvəl və sonra təmiz vəziyyət təmin edin
- CI/CD kanalına daxil edin: İnteqrasiya testlərini davamlı inteqrasiyanın bir hissəsi kimi işlədin
Nümunə: REST API üçün İnteqrasiya Testi
Koda bax
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class UserControllerIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private UserRepository userRepository;
@BeforeEach
void setup() {
userRepository.deleteAll();
}
@Test
void createUser_shouldReturnCreatedUser() {
// Prepare test data
UserDto userDto = new UserDto("john", "john@example.com");
// Send request to the API
ResponseEntity<User> response = restTemplate.postForEntity(
"/api/users", userDto, User.class);
// Verify response
assertEquals(HttpStatus.CREATED, response.getStatusCode());
assertNotNull(response.getBody());
assertEquals("john", response.getBody().getUsername());
// Verify data was saved to the database
Optional<User> savedUser = userRepository.findByUsername("john");
assertTrue(savedUser.isPresent());
}
}
Nümunə: Testcontainers ilə İnteqrasiya Testi
Koda bax
@Testcontainers
public class UserServiceIntegrationTest {
@Container
private static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
private UserService userService;
private UserRepository userRepository;
@BeforeEach
void setup() {
// Configure datasource with container connection details
DataSource dataSource = DataSourceBuilder.create()
.url(postgres.getJdbcUrl())
.username(postgres.getUsername())
.password(postgres.getPassword())
.build();
userRepository = new UserRepositoryImpl(dataSource);
userService = new UserService(userRepository);
}
@Test
void createAndRetrieveUser() {
// Create a user
User user = new User("alice", "alice@example.com");
userService.createUser(user);
// Retrieve and verify
User retrieved = userService.findByUsername("alice");
assertNotNull(retrieved);
assertEquals("alice@example.com", retrieved.getEmail());
}
}
İnteqrasiya Testlərinin Nə Vaxt İstifadə Ediləcəyi
- Çoxsaylı komponentlər arası qarşılıqlı əlaqəni testləmək
- Məlumat bazası əməliyyatlarını yoxlamaq
- API endpoint-lərini testləmək
- Hadisə əsaslı sistemlərdə mesaj emalını təsdiqləmək