← Назад к вопросам

Приведи пример задач, которые решал в интеграционном тестировании

2.0 Middle🔥 131 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Примеры задач в интеграционном тестировании из моего опыта

В интеграционном тестировании я решал широкий спектр задач — от проверки взаимодействия микросервисов до тестирования интеграции с внешними системами. Вот конкретные примеры:

1. Тестирование взаимодействия микросервисов в e-commerce системе

Задача: Проверить корректность работы цепочки сервисов при оформлении заказа: User ServiceCart ServiceOrder ServicePayment ServiceNotification Service.

Проблема: При падении одного из сервисов вся цепочка должна обрабатывать ошибки gracefully, не теряя данные и предоставляя понятные статусы.

Решение: Я создал интеграционный тестовый фреймворк на Java + Spring Boot Test + Testcontainers, который:

  • Запускал все необходимые сервисы в Docker-контейнерах
  • Эмулировал различные сценарии (успешный заказ, отказ платежа, недоступность сервиса корзины)
  • Проверял консистентность данных между сервисами
@Test
@DisplayName("Order flow integration: happy path")
public void testSuccessfulOrderFlow() {
    // 1. Создание пользователя через User Service
    User user = userClient.createUser(testUser);
    
    // 2. Добавление товара в корзину через Cart Service
    Cart cart = cartClient.addToCart(user.getId(), productId);
    
    // 3. Оформление заказа через Order Service
    Order order = orderClient.createOrder(user.getId(), cart.getId());
    
    // 4. Проверка, что платеж обработан
    PaymentStatus payment = paymentClient.getStatus(order.getPaymentId());
    assertThat(payment).isEqualTo(PaymentStatus.COMPLETED);
    
    // 5. Проверка, что уведомление отправлено
    Notification notification = notificationClient.getLastNotification(user.getId());
    assertThat(notification.getType()).isEqualTo("ORDER_CONFIRMED");
    
    // 6. Верификация консистентности данных
    assertDataConsistency(user.getId(), order.getId());
}

2. Интеграция с внешним платежным шлюзом

Задача: Протестировать взаимодействие нашей системы с внешним платежным провайдером (например, Stripe или PayPal).

Сложность: Нельзя выполнять реальные платежи в тестах, но нужно проверить все сценарии: успешный платеж, отказ, 3D Secure, возвраты.

Решение: Использовал sandbox-окружение платежного шлюза + мокирование для edge-cases:

import pytest
from unittest.mock import patch
from payment_integration import PaymentProcessor

class TestPaymentGatewayIntegration:
    
    @pytest.fixture
    def processor(self):
        return PaymentProcessor(api_key="sandbox_key")
    
    def test_successful_payment(self, processor):
        """Тест успешного платежа с реальным вызовом sandbox API"""
        result = processor.charge(amount=100, currency="USD", token="test_valid_token")
        assert result.status == "succeeded"
        assert result.transaction_id is not None
    
    def test_insufficient_funds(self, processor):
        """Тест отказа платежа из-за недостатка средств"""
        # Используем специальный test token от платежного шлюза
        result = processor.charge(amount=1000, currency="USD", token="test_insufficient_funds")
        assert result.status == "declined"
        assert result.decline_reason == "insufficient_funds"
    
    @patch('payment_integration.PaymentGatewayClient')
    def test_network_timeout(self, mock_gateway, processor):
        """Тест обработки таймаута при вызове внешнего API"""
        mock_gateway.return_value.process_payment.side_effect = TimeoutError()
        
        with pytest.raises(PaymentTimeoutException):
            processor.charge(amount=100, currency="USD", token="any_token")

3. Тестирование интеграции с кэширующим сервером (Redis)

Задача: Убедиться, что приложение корректно работает с Redis: кэширует данные, обрабатывает недоступность кэша, инвалидирует кэш при изменении данных.

Решение: Написал тесты с использованием Testcontainers для Redis:

@SpringBootTest
@Testcontainers
public class RedisCacheIntegrationTest {
    
    @Container
    static RedisContainer redis = new RedisContainer("redis:7-alpine");
    
    @DynamicPropertySource
    static void redisProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.redis.host", redis::getHost);
        registry.add("spring.redis.port", redis::getFirstMappedPort);
    }
    
    @Autowired
    private ProductService productService;
    
    @Test
    public void testCacheHit() {
        // Первый вызов - должен запросить из БД и сохранить в кэш
        Product product1 = productService.getProduct(1L);
        
        // Второй вызов - должен взять из кэша
        Product product2 = productService.getProduct(1L);
        
        // Проверяем, что это один и тот же объект (из кэша)
        assertThat(product1 == product2).isTrue();
    }
    
    @Test
    public void testCacheEviction() {
        Product initial = productService.getProduct(1L);
        productService.updateProduct(1L, "New Name");
        
        // После обновления кэш должен инвалидироваться
        Product updated = productService.getProduct(1L);
        assertThat(updated.getName()).isEqualTo("New Name");
    }
}

4. Проверка интеграции с message broker (Kafka)

Задача: Убедиться, что события корректно публикуются в Kafka и консьюмеры их обрабатывают.

Ключевые аспекты:

  • Отправка и получение сообщений
  • Обработка poison pills (битых сообщений)
  • Ретри механизмы
  • Порядок обработки сообщений
import pytest
from kafka import KafkaProducer, KafkaConsumer
from testcontainers.kafka import KafkaContainer

def test_order_event_publishing():
    with KafkaContainer("confluentinc/cp-kafka:latest") as kafka:
        bootstrap_servers = kafka.get_bootstrap_servers()
        
        producer = KafkaProducer(
            bootstrap_servers=bootstrap_servers,
            value_serializer=lambda v: json.dumps(v).encode('utf-8')
        )
        
        # Публикация тестового события
        test_event = {"order_id": 123, "status": "created"}
        producer.send("orders", value=test_event)
        producer.flush()
        
        # Чтение и проверка события
        consumer = KafkaConsumer(
            "orders",
            bootstrap_servers=bootstrap_servers,
            value_deserializer=lambda v: json.loads(v.decode('utf-8'))
        )
        
        # Ожидаем появление сообщения
        msg = next(consumer)
        assert msg.value["order_id"] == 123
        assert msg.value["status"] == "created"

5. Интеграционное тестирование с базой данных

Задача: Проверить корректность миграций БД, работы ORM и сложных SQL-запросов.

Особенности: Тестировал Flyway миграции, проверяя что:

  • Все миграции применяются последовательно
  • Откаты (rollbacks) работают корректно
  • Данные сохраняются между миграциями
-- Пример теста для проверки миграции
BEGIN TRANSACTION;

-- Применяем миграцию
INSERT INTO migration_history (version, description) 
VALUES ('2023.10.01', 'Add user preferences column');

ALTER TABLE users ADD COLUMN preferences JSONB;

-- Проверяем результат
DO $$
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_name = 'users' AND column_name = 'preferences'
    ) THEN
        RAISE EXCEPTION 'Migration failed: column not added';
    END IF;
END $$;

ROLLBACK; -- Важно не оставлять данных после теста

Выводы и лучшие практики

Из своего опыта я вынес несколько важных уроков:

  1. Используйте изоляцию тестов — каждый интеграционный тест должен работать в чистом окружении
  2. Эмулируйте реальные сценарии — включая сетевые проблемы, таймауты, некорректные ответы
  3. Проверяйте консистентность данных — это главная цель интеграционного тестирования
  4. Автоматизируйте развертывание тестового окружения с помощью Docker, Kubernetes или облачных сервисов
  5. Мониторьте покрытие интеграционными тестами — они должны проверять именно взаимодействие компонентов, а не их внутреннюю логику

Интеграционное тестирование требует глубокого понимания архитектуры системы, но именно оно выявляет самые коварные bugs, которые не найти на уровне модульных тестов.

Приведи пример задач, которые решал в интеграционном тестировании | PrepBro