Что даёт JSONPlaceholder

  • Предсказуемые ресурсы. Посты, комментарии, пользователи, задачи и альбомы — со стабильными идентификаторами и единообразной структурой.

  • Все HTTP-методы. GET, POST, PUT, PATCH и DELETE — все отвечают осмысленно.

  • Вложенные связи. Комментарии принадлежат постам, посты — пользователям. Структуры достаточно, чтобы на ней тренироваться.

Случайный урок

Запись в JSONPlaceholder имитируется. Вы отправляете POST, получаете 201 с идентификатором — и ничего не сохранилось. Запросите объект обратно, и его там не окажется.

Большинство считает это ограничением. На самом деле это самое полезное, что есть в сервисе, потому что оно разделяет две вещи, которые новички постоянно путают: запрос выполнен успешно и изменение действительно произошло. Набор тестов, который проверяет только коды статусов, будет уверенно и бесконечно проходить здесь любой тест на запись.

Если ваша проверка переживает фиктивную запись в JSONPlaceholder, значит, проверка слабая. Перепишите её так, чтобы она убеждалась: объект после запроса действительно существует, — и перенесите эту привычку на свой настоящий API, где та же слабость незаметна.

Что здесь отрабатывать и в каком порядке

Структура и поля

  • Проверяйте структуру тела ответа, а не статус.

  • Проверяйте типы, а не только наличие полей.

Связи

  • Запросите пост, затем его комментарии и убедитесь, что они действительно ссылаются на него.

  • Большинство реальных багов живёт между двумя вызовами.

Сценарии ошибок

  • Запросите несуществующий идентификатор и убедитесь, что ответ имеет правильную структуру.

  • Тест, который все пропускают, — и именно он что-то находит.

Чему он научить не может

Всему, что связано с состоянием, — то есть всему, из-за чего тестирование настоящих API сложное. Сессии и их истечение, значения, взятые из одного ответа и использованные в следующем, вызовы, которые должны идти в определённом порядке, и очистка после прогона. Ничего этого в JSONPlaceholder нет, потому что данные не сохраняются.

Поэтому он отлично подходит для первого часа и вводит в заблуждение на второй неделе. Переходите на API с настоящим состоянием, как только базовые вещи станут привычными, и будьте готовы к резкому росту сложности.

Первый час, который пригодится дальше

Если хотите, чтобы тренировка чего-то стоила на вашем собственном API, выполните эти четыре шага по порядку, а не исследуйте наугад.

Запросите пост и проверьте три конкретных поля вместе с их типами, а не только сам факт успешного вызова. Запросите несуществующий пост и проверьте статус и структуру того, что вернулось. Запросите пост, затем его комментарии и убедитесь, что каждый комментарий ссылается именно на запрошенный пост. Затем создайте пост, запросите его обратно и посмотрите, как проверка провалится.

Последний шаг — и есть смысл всего упражнения. Запись отчиталась об успехе, идентификатор вернулся, а данные не сохранились. Все привычки, которые стоит перенести на настоящий API, сводятся к тому, чтобы понять, почему ваш тест всё равно прошёл, и переписать его так, чтобы он не проходил.

Переход на настоящий сервис

Эти четыре вещи специализированный слой берёт на себя как Auto-Authentication, Dynamic Variables, Dependency Chains и Auto-Cleanup. Механика описана в документации по тестированию API.

Терминал

npm install -g @testsprite/testsprite-cli
testsprite setup

Панель управления закрывает то же самое для тех, кто не хочет ставить ничего локально, а полный набор команд лежит в репозитории CLI.

Что меняется, когда вы направляете его на настоящий API

Всё, чему JSONPlaceholder научить не может, берёт на себя TestSprite. Auto-Authentication — для сессий, которые истекают посреди прогона. Dynamic Variables — для идентификатора, который возвращает вызов создания. Dependency Chains — для вызовов, которые невозможны, пока не произошло что-то другое. Auto-Cleanup — для записей, остающихся после каждого прогона.

Начало то же, что и в упражнении выше: направьте проект на свой базовый URL, дайте API Discovery перечислить то, что есть, и прочитайте сгенерированный план, прежде чем что-либо запускать. Разница в том, что теперь план охватывает авторизацию и граничные случаи на сервисе, где запись действительно сохраняется.

Вы получаете то, к чему вела вся тренировка: проверки, которые выдерживают столкновение с состоянием и выполняются при каждом изменении, а не тогда, когда вы про них вспомните.

Почему мои POST-запросы ничего не сохраняют?

Так задумано. JSONPlaceholder имитирует запись. Воспользуйтесь этим как уроком: проверяйте результат, а не ответ.

Подходит ли он для CI?

Для обучающего набора тестов — иногда. Для всего, что запускается на каждый коммит, используйте локальный мок. Это бесплатный общий сервис.

На что переходить дальше?

На что-то с аутентификацией и настоящим сохранением данных. Скачок сложности — это и есть смысл, именно с него начинается навык, который переносится дальше.

Можно ли направить на него генератор тестов?

Да, и это безопасное место, чтобы посмотреть, как выглядит сгенерированное покрытие: здесь нечего испортить.

Есть ли альтернативы?

HTTPBin — для намеренных сбоев и кодов статуса, PokeAPI — для пагинации на объёме, публичный GitHub API — для поведения с аутентификацией.

Коротко

Фиктивная запись — лучший урок здесь.

JSONPlaceholder безопасно учит структуре запросов, связям и сценариям ошибок. Имитация записи обнажает разницу между успешным запросом и реальным изменением — именно эту привычку стоит унести с собой. Как только основы усвоены, переходите на API с состоянием.