Тренажёр автотестов API для тестировщиков
Запросы на requests и автотесты на pytest против API магазина. Тест засчитывается, если он проходит на исправном API и падает на версиях с заложенными багами.
- Задач
- 80
- Среда
- requests и pytest, учебный API
- Тариф
- Базовый на выбор или Pro

Что тренируем
- requests: GET, POST, PUT, PATCH и DELETE, параметры, заголовки, JSON-тело, статусы и raise_for_status
- pytest: тестовые функции, assert, фикстуры и conftest, scope, parametrize, mark, pytest.raises
- Проверка ответов по JSON Schema, CRUD и негативные проверки, пагинация и граничные значения
- Архитектура автотестов: API-клиент и слои, фабрики данных, конфиг окружения, ретраи и таймауты
Как устроена проверка
Код выполняется прямо в браузере, проверка — на сервере: ваши тесты должны пройти на исправном API и поймать заложенные в него баги. К каждой задаче есть подсказка и карточки справочника.
Среда: requests и pytest, учебный API. Всё работает в браузере, устанавливать ничего не нужно.
Уровни и число задач
Четыре уровня. Следующий открывается, когда решена треть задач предыдущего (30 %).
| Уровень | Задач | Открывается |
|---|---|---|
| Простой | 20 | сразу |
| Средний | 20 | после 6 из 20 задач уровня «Простой» |
| Сложный | 20 | после 6 из 20 задач уровня «Средний» |
| Продвинутый | 20 | после 6 из 20 задач уровня «Сложный» |
Примеры задач
По задаче с простого и продвинутого уровней и две со среднего, с условием как в тренажёре. Проверка, подсказки и справочник открываются после регистрации.
- Простой
Первый запрос
Знакомство с
requests. Напиши функциюget_health(): она отправляет запросGET /healthк учебному API и возвращает тело ответа в виде словаря Python (разобранный JSON), а не строку.По документации живой сервис отвечает на этот запрос статусом 200 и телом
{"status": "ok"}, поэтомуget_health()должна вернуть словарь с ключомstatus.Адрес API уже лежит в переменной
BASE_URL— путь эндпоинта дописывается к нему. - Средний
Три теста одной карточки
Один большой тест с десятью проверками неудобен: упал первый
assert— остальные уже не выполнились, и по отчёту не понять, что ещё сломано. Поэтому проверки разносят по отдельным тестам.Напиши три теста карточки товара 23 (
GET /products/{product_id}, схемаProductв документации):test_card_is_requested_product— код ответа 200, и в теле именно товар 23;test_price_is_number— цена — число (не строка), и она равна 4990;test_stock_is_integer— полеstockв карточке есть, и это целое число.
К
assertудобно добавить сообщение — через запятую после условия: что ожидалось и что пришло на самом деле. Тогда в отчёте pytest сразу видно фактическое значение. - Средний
raise_for_status в тестах
У объекта ответа есть метод
raise_for_status(): при коде 4xx или 5xx он поднимает исключениеrequests.HTTPError, а при успешном ответе ничего не делает. В тестах это короткий способ сказать «ответ должен быть успешным» — и, наоборот, проверить, что ошибка действительно есть.Напиши три теста:
test_health_is_ok—GET /healthуспешен (используйraise_for_status()), а тело — ровно то, что в документации;test_existing_product— карточка товара 12 открывается без ошибки, и в ней товар 12;test_missing_product_raises— для товара 777, которого нет,raise_for_status()поднимает именноrequests.HTTPError. Проверь это черезpytest.raises.
- Продвинутый
Класс-клиент магазина
Когда тестов становится много, адрес стенда, токен и пути эндпоинтов не повторяют в каждом тесте, а прячут в класс-клиент — тот же приём, что Page Object в UI-тестах. Напиши класс
ShopClient:ShopClient(base_url)запоминает базовый адрес и создаёт однуrequests.Sessionв атрибутеsession— через неё идут все запросы клиента. Адрес может прийти и со слэшем на конце (https://shop.api.test/): путь запроса всё равно должен получиться/products/1, а не//products/1.login(email, password)входит черезPOST /auth/loginи кладёт заголовокAuthorization: Bearer <токен>в заголовки сессии — после этого все запросы клиента авторизованы.get_product(product_id)возвращает карточку товараGET /products/{product_id}— словарь, разобранный JSON.me()возвращает профиль текущего пользователяGET /users/me— тоже словарь.
Если API ответил ошибкой (4xx или 5xx),
get_productиmeне возвращают тело ошибки, а поднимаютrequests.HTTPError: вызывающий код не должен по ошибке принять{"error": ...}за товар.
В каком тарифе
Автотесты API входит в три тренажёра на выбор в Базовом и во все тренажёры в Pro. Демо открывает всё.
Демо0 ₽
3 дня бесплатно после регистрации, без карты: все тренажёры и справочник
Базовый399 ₽ за 30 дней
Три тренажёра на выбор на 30 дней
Pro999 ₽ за 30 дней
Все тренажёры и Йова