Как тестируешь API

Ответ

Тестирование API можно разделить на несколько уровней:

  1. Юнит-тесты - проверка отдельных функций/методов API:
test('GET /users returns 200 status', async () => {
  const res = await request(app).get('/users');
  expect(res.statusCode).toBe(200);
});
  1. Интеграционные тесты - проверка взаимодействия с БД и другими сервисами:
test('POST /users creates new user', async () => {
  const res = await request(app)
    .post('/users')
    .send({name: 'Test'});
  expect(res.body).toHaveProperty('id');
});
  1. E2E тесты - проверка полного цикла работы API.

Использую:

  • Jest + Supertest для Node.js API
  • Postman/Newman для коллекций тестов
  • Swagger для валидации схемы ответов
  • Моки данных для тестирования edge cases

Особое внимание уделяю:

  • Кодам ответов (200, 400, 404, 500)
  • Валидации входных данных
  • Обработке ошибок
  • Производительности (таймауты, нагрузка)

Ответ 18+ 🔞

Слушай, а вот этот ваш API-тестинг, он же, блядь, как слоёный пирог, понимаешь? Нельзя просто так, с бухты-барахты, подойти и начать ебашить запросы куда попало. Тут система, блядь, чёткая, как у спецназа.

Вот смотри, первый уровень — это как разведка боем, юнит-тесты. Берёшь одну мелкую функцию, какого-нибудь ебучего обработчика роута, и начинаешь её мучать. Типа: «А ну-ка, сука, верни мне статус 200, когда я запрашиваю /users!». Всё просто, изолированно.

test('GET /users returns 200 status', async () => {
  const res = await request(app).get('/users');
  expect(res.statusCode).toBe(200); // Не 200? Иди нахуй, тест не прошёл.
});

Дальше — интеграционные тесты. Тут уже веселее, ебать мои старые костыли. Это когда твой API начинает общаться с базой данных или другими сервисами. Ты как бы проверяешь: «А не обосрётся ли всё к чертям, когда я попробую создать нового юзера?». Подкидываешь данные и ждёшь, что в ответе будет какой-никакой id.

test('POST /users creates new user', async () => {
  const res = await request(app)
    .post('/users')
    .send({name: 'Test'}); // Кидаем "Test", а вдруг он "Tеst" с русской "е" примет? Хуй знает.
  expect(res.body).toHaveProperty('id'); // Нет айдишника? Пиздец, логика сломалась.
});

Ну и вершина ебли — E2E тесты. Это когда ты запускаешь целый сценарий, как будто реальный пользователь, и смотришь, не развалится ли вся эта конструкция нахуй к середине пути. Волнение ебать, каждый раз.

А инструменты? Да их, блядь, овердохуища! Я вот, например, частенько:

  • Jest + Supertest для всего этого цирка на Node.js. Удобно, родное.
  • Postman/Newman — чтобы эти тестовые сценарии в коллекции запихнуть и потом ими, как дубиной, по продакшену стучать.
  • Swagger — чтобы не гадать, что там должно вернуться, а свериться со схемой, как с Библией. Хотя иногда и она врёт, пидарас шерстяной.
  • Моки данных — это святое! Надо же проверить, что будет, если вместо числа передать строку, или null, или пустой объект. Edge cases, блядь! На них всё и ломается, хитрая жопа.

И главное, на что я ору, как сумасшедший:

  • Коды ответов. 200 — хорошо. 400 — сам дурак, данные кривые отправил. 404 — иди нахуй, ничего нет. 500 — вот тут уже ой, сервер обосрался, надо разбираться.
  • Валидация. Чтобы любой долбоёб не мог отправить в поле возраста строку "старый как хуй с горы" и сломать всё.
  • Обработка ошибок. Чтобы вместо белого экрана смерти приложение вежливо говорило: «Извините, ебанат, вы всё сломали».
  • Производительность. Чтобы запрос не висел, как говно в проруби, 30 секунд. Таймауты, нагрузка — всё это надо гонять, пока не заорёт.

Вот так вот, нехитро, но если делать спустя рукава, получится пиздопроебищно, а не API.