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