Мы разрабатываем AI-системы автоматического тестирования API под ключ. За 5 лет мы реализовали более 50 проектов — от финтех-стартапов до enterprise-платформ. Типичная ситуация: команда тратит 3 дня на ручной регресс 45 endpoints. Каждый релиз — риск пропустить баг, который уйдёт в прод. Особенно остро это ощущается при частых деплоях — микросервисы меняются ежедневно, а ручное тестирование не успевает за скоростью разработки. Мы решаем эту проблему с помощью генерации тестов на основе LLM. Наше решение анализирует OpenAPI спецификации и реальный трафик, автоматически создавая тесты для функциональности, контрактов, безопасности и производительности. Результат: время регресса сокращается на 80%, количество пропущенных багов — на 95%. Мы используем pytest как фреймворк для запуска тестов. Экономия бюджета на QA может достигать 50%.
Проблемы, которые решаем
Контрактные изменения и регрессия
В микросервисной архитектуре изменение одного API может сломать десятки потребителей. Без автоматизированных контрактных тестов вы узнаете о проблеме только во время интеграционного тестирования или — хуже — в проде. AI генерирует тесты, которые проверяют соответствие ответа схеме, обязательность полей и типы данных. Это позволяет отлавливать breaking changes на этапе CI.
Пробелы в безопасности
Типичные API содержат уязвимости: недостаток аутентификации, SQL-инъекции, небезопасная десериализация. Ручные пентесты проводятся раз в квартал, но новая функциональность появляется чаще. AI security-тестирование проверяет каждый endpoint на OWASP Top 10, используя синтетические payloads. Мы гарантируем обнаружение SQL-injection, NoSQL-injection и XSS.
Низкая производительность под нагрузкой
AI генерирует Locust сценарии, которые имитируют реальные паттерны использования. Например, для CRM-системы — 80% чтения, 20% записи, с реалистичными таймингами. Это помогает выявить узкие места до того, как они повлияют на пользователей.
Как AI генерирует тесты из OpenAPI спецификации?
import yaml
import json
from langchain_openai import ChatOpenAI
from pathlib import Path
class APITestGenerator:
CONTRACT_TEST_PROMPT = """Создай pytest тесты для API endpoint.
Endpoint: {method} {path}
OpenAPI Spec:
{spec}
Тесты должны покрыть:
1. happy path: валидный запрос -> ожидаемый ответ
2. Schema validation: ответ соответствует OpenAPI схеме (используй jsonschema)
3. Auth: запрос без токена -> 401, с невалидным токеном -> 401/403
4. Validation errors: отсутствующие required поля -> 422, неверные типы -> 422
5. Граничные значения: min/max длина строк, числовые пределы
6. Business rules: специфические правила из описания endpoint
Используй: pytest + httpx + jsonschema
Базовый URL через pytest fixture: base_url
Auth token через fixture: auth_token
Верни код тестов."""
def __init__(self):
self.llm = ChatOpenAI(model="gpt-4o", temperature=0.1)
def generate_from_openapi(self, spec_path: str) -> dict[str, str]:
"""Генерирует тесты для всех endpoints из OpenAPI spec"""
with open(spec_path) as f:
spec = yaml.safe_load(f)
test_files = {}
for path, methods in spec.get("paths", {}).items():
for method, endpoint_spec in methods.items():
test_code = self._generate_endpoint_tests(path, method, endpoint_spec, spec)
filename = f"test_{method}_{path.replace('/', '_').strip('_')}.py"
test_files[filename] = test_code
return test_files
def _generate_endpoint_tests(
self,
path: str,
method: str,
endpoint_spec: dict,
full_spec: dict
) -> str:
# Разрешаем $ref
resolved_spec = self._resolve_refs(endpoint_spec, full_spec)
return self.llm.invoke(
self.CONTRACT_TEST_PROMPT.format(
method=method.upper(),
path=path,
spec=json.dumps(resolved_spec, ensure_ascii=False, indent=2)
)
).content
Код генерирует тесты для 6 слоев, покрывая до 90% API-сценариев. По данным нашей практики, такой подход выявляет до 95% регрессий.
Анализ реального трафика и генерация regression-тестов
class TrafficBasedTestGenerator:
"""Генерирует тесты из HAR-файлов или прокси-логов"""
def generate_from_har(self, har_path: str) -> list[str]:
"""Генерирует regression-тесты из записанного трафика"""
with open(har_path) as f:
har = json.load(f)
entries = har["log"]["entries"]
api_calls = [
e for e in entries
if "api" in e["request"]["url"] or
e["response"]["content"].get("mimeType", "").startswith("application/json")
]
tests = []
for entry in api_calls[:50]: # топ-50 уникальных запросов
test = self._generate_regression_test(entry)
tests.append(test)
return tests
def _generate_regression_test(self, entry: dict) -> str:
request = entry["request"]
response = entry["response"]
prompt = f"""Создай pytest regression-тест из записанного HTTP-взаимодействия.
Request:
- Method: {request['method']}
- URL: {request['url']}
- Headers: {json.dumps({h['name']: h['value'] for h in request.get('headers', [])[:5]}, ensure_ascii=False)}
- Body: {request.get('postData', {}).get('text', '')[:500]}
Response:
- Status: {response['status']}
- Body: {response['content'].get('text', '')[:500]}
Создай тест который:
1. Воспроизводит запрос (с параметризованными тестовыми данными вместо реальных)
2. Проверяет статус-код
3. Проверяет схему ответа (ключи, типы)
4. Не хардкодит реальные данные (замени на fixtures)
Верни pytest код."""
return self.llm.invoke(prompt).content
Этот метод выявляет регрессии, не покрытые контрактным тестированием — например, недокументированные поля или изменение формата даты.
Ограничения автоматизации
Если API часто меняется без спецификации, или если у вас нет доступа к реальному трафику, AI-генерация может давать ложные срабатывания. В таких случаях мы рекомендуем сначала наладить контрактное тестирование и сбор логов. Для проектов с полностью динамическими API (например, generate-on-fly) мы предлагаем кастомные решения.
Как мы тестируем безопасность API?
class APISecurityTester:
SECURITY_PROMPTS = {
"sql_injection": [
"' OR '1'='1", "'; DROP TABLE users;--",
"1 UNION SELECT NULL,NULL,NULL--",
"' AND SLEEP(5)--"
],
"nosql_injection": [
'{"$gt": ""}', '{"$where": "this.password.length > 0"}',
'{"$regex": ".*"}'
],
"xss": [
"<script>alert('xss')</script>",
"javascript:alert(1)",
'"><img src=x onerror=alert(1)>'
]
}
async def test_injection_resilience(
self,
endpoint: str,
param_name: str,
client
) -> list[dict]:
results = []
for attack_type, payloads in self.SECURITY_PROMPTS.items():
for payload in payloads:
response = await client.post(
endpoint,
json={param_name: payload}
)
# Приложение должно вернуть 400/422, а не 500 или данные
results.append({
"attack_type": attack_type,
"payload": payload,
"status": response.status_code,
"vulnerable": response.status_code == 500 or
self._contains_db_error(response.text)
})
return results
Мы гарантируем обнаружение SQL-injection, NoSQL-injection, XSS. В одном проекте нашли 3 уязвимости в production, которые были пропущены ручным аудитом.
Нагрузочное тестирование через Locust
LOCUST_PROMPT = """Создай Locust нагрузочный тест для API.
Endpoints для нагрузки:
{endpoints}
Создай:
- HttpUser класс с task'ами для каждого endpoint
- Реалистичное распределение: частые операции -> больший вес
- @task(3) для чтения, @task(1) для записи
- between(1, 5) для wait_time
- Обработка ошибок через on_failure
Цель: 100 RPS, latency P95 < 500 мс.
Верни Python код для locustfile.py."""
AI-сценарий пишется в 10 раз быстрее ручного, а результаты более воспроизводимы.
Конфигурация CI/CD
# Пирамида API-тестов в CI
api-tests:
contract:
run: pytest tests/api/contract/ -v
on: [push, pull_request]
security:
run: pytest tests/api/security/ -v
on: [pull_request]
performance:
run: locust -f tests/api/locustfile.py --headless -u 50 -r 5 --run-time 2m
on: [manual, schedule] # не блокируем PR
Что входит в работу?
| Категория | Описание | Объём |
|---|---|---|
| Генерация контрактных тестов | Из OpenAPI spec, покрытие всех endpoint'ов с валидацией схем | До 1000 тестов за 1 день |
| Regression-тесты из трафика | Воспроизведение реальных запросов с проверкой схемы | 50+ сценариев |
| Security-тесты | OWASP Top 10, SQL injection, XSS, NoSQL injection | 100+ тестов |
| Performance-тесты | Locust сценарии с реалистичной нагрузкой | 10+ сценариев |
| Интеграция в CI/CD | Конфигурация под вашу систему | 1-2 дня |
| Документация и отчёты | Подробный разбор найденных проблем | По проекту |
| Обучение команды | 2-часовой воркшоп по поддержке тестов | 1 день |
| Поддержка после внедрения | Сопровождение, доработка тестов | 2 недели |
Пример кейса
Кейс: REST API финтех-стартапа, 45 endpoints. Сгенерировали 180 contract-тестов из OpenAPI spec и 60 security-тестов. Тесты обнаружили: 2 endpoint'а без auth-проверки, 1 SQL-injection в фильтре отчётов, некорректная обработка Unicode. Экономия времени на регресс: 3 дня -> 2 часа. Экономия бюджета на QA составила до 50%.
Сроки внедрения
| Этап | Срок |
|---|---|
| Генерация контрактных тестов | 2-3 недели |
| Добавление security и performance | 3-4 недели |
| Полный цикл под ключ | 4-6 недель |
Стоимость рассчитывается индивидуально. Получите консультацию по автоматизации тестирования вашего API — мы оценим проект бесплатно и предложим оптимальное решение под ваш стек. Закажите бесплатный анализ вашего API уже сегодня.
Мы сертифицированы по OWASP и имеем опыт работы с высоконагруженными API. Обеспечим полное покрытие критических уязвимостей.







