Ответ
На проекте по тестированию REST API микросервисной архитектуры был выстроен следующий процесс:
1. Технологический стек:
- Язык/Фреймворк: Python 3.9+,
pytestкак основной runner и ассершн-библиотека. - HTTP-клиент:
requestsдля отправки запросов к API. - Управление зависимостями:
pipиrequirements.txt. - Данные и фикстуры:
pytestфикстуры для подготовки тестового окружения и данных. - Отчетность:
pytest-htmlдля базовых отчетов иAllureдля детализированных. - CI/CD: GitLab CI для запуска тестов на merge/push.
2. Структура и ключевые практики:
# Пример структуры теста API
import pytest
import requests
BASE_URL = "https://api.example.com/v1"
# Фикстура для создания тестового пользователя
@pytest.fixture
def test_user():
payload = {"name": "Test User", "email": "test@example.com"}
response = requests.post(f"{BASE_URL}/users", json=payload)
user_id = response.json()["id"]
yield user_id
# Пост-очистка после теста
requests.delete(f"{BASE_URL}/users/{user_id}")
# Параметризованный тест
@pytest.mark.parametrize("status, expected_count", [
("active", 1),
("inactive", 0),
("", 0) # Граничный случай
])
def test_filter_users_by_status(test_user, status, expected_count):
"""Тест проверяет фильтрацию пользователей по статусу."""
# When: Отправляем запрос с фильтром
params = {"status": status} if status else {}
response = requests.get(f"{BASE_URL}/users", params=params)
# Then: Проверяем статус код и количество найденных пользователей
assert response.status_code == 200
users = response.json()
assert len(users) == expected_count
if expected_count > 0:
assert all(user["status"] == status for user in users)
3. Интеграция в CI/CD (GitLab CI):
# .gitlab-ci.yml
stages:
- test
api-tests:
stage: test
image: python:3.9-slim
script:
- pip install -r requirements.txt
- pytest tests/api/ --alluredir=allure-results
artifacts:
when: always
paths:
- allure-results/
Итог: Такой подход обеспечивал стабильный прогон тестов, быструю обратную связь для разработчиков и наглядную отчетность о покрытии и дефектах.