Тренажёр автотестов API для тестировщиков

Запросы на requests и автотесты на pytest против API магазина. Тест засчитывается, если он проходит на исправном API и падает на версиях с заложенными багами.

Задач
80
Среда
requests и pytest, учебный API
Тариф
Базовый на выбор или Pro
yqw / pyapi / простой
live
Рабочая область тренажёра Автотесты API: задача простого уровня и requests и pytest, учебный API

Что тренируем

  • 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 дней

    Все тренажёры и Йова

Другие тренажёры

Все тренажёры · На главную