Приведи пример тест-кейса из интеграционного тестирования
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример тест-кейса для интеграционного тестирования
Ниже приведен подробный пример тест-кейса для проверки интеграции между сервисом авторизации пользователей и сервисом управления профилями. Этот сценарий типичен для микросервисной архитектуры, где важно убедиться, что два независимых компонента корректно обмениваются данными и обрабатывают пограничные состояния.
Тест-кейс: Интеграция сервиса авторизации и сервиса профилей
ID: INT-AUTH-PROF-001
Название: Проверка создания профиля пользователя после успешной регистрации в системе.
Приоритет: Высокий
Модуль: Интеграция сервисов авторизации и управления профилями
Предусловия:
- Сервис авторизации и сервис профилей развернуты и доступны.
- База данных сервиса профилей очищена от тестовых данных.
- Межсервисное взаимодействие (например, через REST API или очередь сообщений Kafka/RabbitMQ) настроено.
Постусловия: Удалить тестового пользователя через API сервиса администрирования (если предусмотрено) для очистки данных.
Шаги тестирования:
| № | Действие | Ожидаемый результат |
|---|---|---|
| 1 | Отправить POST-запрос к эндпоинту регистрации сервиса авторизации.<br>Тело запроса:<br>json<br>{<br> "email": "test.user@example.com",<br> "password": "Qwerty123!",<br> "username": "test_user"<br>}<br> | Возвращается HTTP 201 Created.<br>Тело ответа содержит уникальный userId, токен доступа и статус "registration": "success". |
| 2 | Опросить (poll) эндпоинт получения профиля сервиса управления профилями, используя userId, полученный на шаге 1.<br>Запрос: GET /api/v1/profiles/{userId} | В течение заданного таймаута (например, 5 секунд) сервис профилей начинает возвращать HTTP 200 OK.<br>Тело ответа содержит объект профиля с полями userId, email, username, соответствующими отправленным, и статусом "isActive": true. |
| 3 | Проверить консистентность данных. Сравнить email и username из шага 1 с данными, полученными из профиля на шаге 2. | Данные (email, username) идентичны в обоих сервисах. Это гарантирует, что событие о создании пользователя было передано без искажений. |
| 4 | (Негативная проверка) Отправить повторно тот же POST-запрос на регистрацию с идентичными данными (шаг 1). | Сервис авторизации возвращает HTTP 409 Conflict или 400 Bad Request с сообщением об ошибке "User already exists". Сервис профилей не создает дубликат записи. |
Почему это именно интеграционный тест?
Данный тест-кейс фокусируется не на внутренней логике каждого сервиса в отдельности (это задача модульных тестов), а на точке соприкосновения между ними. Ключевые аспекты, которые он проверяет:
- Корректность контракта (API/Message Schema): Убеждаемся, что сервис профилей понимает и может обработать событие или запрос, отправленный сервисом авторизации.
- Согласованность данных (Data Consistency): После успешной регистрации профиль должен быть создан с правильными данными. Это проверка целостности бизнес-процесса, разнесенного по двум сервисам.
- Надежность коммуникации: Использование подхода polling на шаге 2 имитирует асинхронное взаимодействие и проверяет, что сообщение не потерялось и было доставлено за приемлемое время.
- Обработка ошибок в связке: Негативный сценарий (шаг 4) проверяет, как система в целом реагирует на конфликт данных. Важно, что оба сервиса ведут себя согласованно (дубликат не создается).
Пример кода для автоматизации такого теста (Python, pytest + requests)
import pytest
import requests
import time
# Конфигурация (вынесена бы в отдельный файл или фикстуру)
AUTH_SERVICE_URL = "http://auth-service:8080"
PROFILE_SERVICE_URL = "http://profile-service:8081"
TEST_TIMEOUT = 5 # секунд
POLL_INTERVAL = 0.5 # секунд
def test_user_profile_creation_after_registration():
"""INT-AUTH-PROF-001: Профиль создается после успешной регистрации."""
# 1. Шаг регистрации
registration_data = {
"email": "test.user@example.com",
"password": "Qwerty123!",
"username": "test_user"
}
reg_response = requests.post(f"{AUTH_SERVICE_URL}/api/auth/register", json=registration_data)
assert reg_response.status_code == 201, f"Ошибка регистрации: {reg_response.text}"
reg_response_json = reg_response.json()
user_id = reg_response_json["userId"] # Ключ из ответа сервиса авторизации
assert user_id is not None, "userId не получен в ответе"
# 2. Шаг опроса сервиса профилей (ожидание асинхронного создания)
profile_url = f"{PROFILE_SERVICE_URL}/api/v1/profiles/{user_id}"
profile_data = None
start_time = time.time()
while time.time() - start_time < TEST_TIMEOUT:
profile_response = requests.get(profile_url)
if profile_response.status_code == 200:
profile_data = profile_response.json()
break
time.sleep(POLL_INTERVAL)
# Проверка, что профиль был найден за отведенное время
assert profile_data is not None, f"Профиль для userId={user_id} не был создан в течение {TEST_TIMEOUT} секунд"
# 3. Проверка консистентности данных
assert profile_data["email"] == registration_data["email"], "Email в профиле не соответствует email при регистрации"
assert profile_data["username"] == registration_data["username"], "Username в профиле не соответствует username при регистрации"
assert profile_data["isActive"] is True, "Профиль создан неактивным"
# 4. (Негативная проверка) Попытка повторной регистрации
duplicate_response = requests.post(f"{AUTH_SERVICE_URL}/api/auth/register", json=registration_data)
assert duplicate_response.status_code in [409, 400], f"Неожиданный код ответа при дубликате: {duplicate_response.status_code}"
assert "already exists" in duplicate_response.text.lower(), "Отсутствует ожидаемое сообщение об ошибке дубликата"
# (Дополнительно) Проверяем, что дубликата профиля нет
profile_check_response = requests.get(profile_url)
assert profile_check_response.status_code == 200
# Можно проверить, что время создания (createdAt) профиля не изменилось
Этот пример демонстрирует, как интеграционный тест объединяет вызовы к разным системам, реализует логику ожидания для асинхронных процессов и проверяет сквозную бизнес-логику, что является его основной целью.