Ответ
Тестирование веб-сервисов строится по многоуровневой стратегии:
1. Контрактное тестирование (Contract Testing):
// Пример с использованием Pact
const provider = new Pact({
consumer: 'FrontendApp',
provider: 'UserService',
});
await provider.addInteraction({
state: 'user exists',
uponReceiving: 'request for user',
withRequest: {
method: 'GET',
path: '/users/123',
},
willRespondWith: {
status: 200,
headers: { 'Content-Type': 'application/json' },
body: {
id: Matchers.integer(123),
name: Matchers.string('John'),
},
},
});
2. Функциональное тестирование API:
import pytest
import requests
from jsonschema import validate
# JSON Schema для валидации ответов
USER_SCHEMA = {
"type": "object",
"properties": {
"id": {"type": "integer"},
"email": {"type": "string", "format": "email"},
"created_at": {"type": "string", "format": "date-time"}
},
"required": ["id", "email"]
}
def test_user_api():
# Позитивный сценарий
response = requests.get(f"{BASE_URL}/users/1")
assert response.status_code == 200
# Валидация схемы
data = response.json()
validate(instance=data, schema=USER_SCHEMA)
# Негативный сценарий
response = requests.get(f"{BASE_URL}/users/99999")
assert response.status_code == 404
3. Тестирование граничных значений и ошибок:
- Rate limiting – проверка ограничений на количество запросов
- Валидация входных данных – неверные типы, отсутствующие поля
- Пагинация – корректность работы limit/offset
- Сортировка и фильтрация – complex query parameters
4. Тестирование безопасности:
- Authentication/Authorization – JWT, OAuth2 токены
- SQL/NoSQL injection – попытки инъекций в параметры
- Mass Assignment – защита от перезаписи полей
- CORS – корректная настройка cross-origin запросов
5. Нагрузочное тестирование:
# Пример с k6
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '30s', target: 50 }, // Наращивание нагрузки
{ duration: '1m', target: 100 }, // Пиковая нагрузка
{ duration: '30s', target: 0 }, // Снижение
],
};
export default function () {
const res = http.get('https://api.example.com/users');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 500ms': (r) => r.timings.duration < 500,
});
sleep(1);
}
6. Мониторинг в production:
- Метрики latency, error rate, throughput
- Алерт при деградации 95-го перцентиля
- Tracing распределенных транзакций