API тестування — один з найважливіших скілів сучасного QA інженера. Більшість веб і мобільних застосунків комунікують через API. Навчившись тестувати API — ви відкриєте можливості, які недоступні в UI тестуванні.
Що таке REST API: максимально просто
API (Application Programming Interface) — спосіб спілкування між програмами.
REST API — архітектурний стиль для API. Уявіть ресторан: є меню (документація), офіціант (API), кухня (сервер). Ви робите замовлення (запит) — отримуєте страву (відповідь).
В REST кожен ресурс має URL, а дії над ним виконуються через HTTP методи.
HTTP методи: що і навіщо
1Ресурс: /api/users
2
3GET /api/users → отримати список всіх users
4GET /api/users/123 → отримати user з ID 123
5POST /api/users → створити нового user
6PUT /api/users/123 → повністю оновити user 123
7PATCH /api/users/123 → частково оновити user 123
8DELETE /api/users/123 → видалити user 123Структура HTTP запиту і відповіді
Запит
1POST /api/users HTTP/1.1
2Host: api.example.com
3Content-Type: application/json
4Authorization: Bearer eyJhbGciOiJIUzI1...
5
6{
7 "name": "Олена Коваль",
8 "email": "olena@example.com",
9 "role": "editor"
10}Метод — що робимо (GET, POST, etc.) URL — з яким ресурсом Headers — метадані запиту (тип контенту, авторизація) Body — дані які надсилаємо (для POST, PUT, PATCH)
Відповідь
1HTTP/1.1 201 Created
2Content-Type: application/json
3
4{
5 "id": 456,
6 "name": "Олена Коваль",
7 "email": "olena@example.com",
8 "role": "editor",
9 "created_at": "2026-06-10T14:23:45Z"
10}Status code — результат операції Headers — метадані відповіді Body — дані у відповіді
Ключові статус-коди
| Код | Назва | Коли очікувати |
|---|---|---|
| 200 | OK | Успішний GET, PATCH, DELETE |
| 201 | Created | Успішний POST (новий ресурс) |
| 204 | No Content | Успішний DELETE без тіла |
| 400 | Bad Request | Невалідні дані в запиті |
| 401 | Unauthorized | Немає або невалідний токен |
| 403 | Forbidden | Немає прав доступу |
| 404 | Not Found | Ресурс не існує |
| 409 | Conflict | Дублікат (email вже зайнятий) |
| 422 | Unprocessable Entity | Валідаційна помилка |
| 500 | Internal Server Error | Помилка сервера |
Що тестувати в API: чеклист
1. Функціональне тестування
1✅ Позитивні сценарії (happy path):
2- Запит з валідними даними → очікуваний статус-код
3- Response body відповідає специфікації (поля, типи даних)
4- Дані коректно зберігаються/оновлюються/видаляються
5
6✅ Негативні сценарії:
7- Запит без авторизації → 401
8- Запит з недостатніми правами → 403
9- Запит до неіснуючого ресурсу → 404
10- Запит з порожнім обов'язковим полем → 400/422
11- Запит з невалідним форматом даних → 400/4222. Тестування авторизації
1- Запит без токена
2- Запит зі старим (expired) токеном
3- Запит з невалідним токеном
4- Запит з токеном іншого user3. Тестування валідації даних
1- Рядки: порожній, пробіли, max довжина+1, SQL injection символи
2- Числа: від'ємні, нуль, дробові якщо ціле очікується
3- Email: без @, без домену, з пробілами
4- Дати: минуле, майбутнє, неіснуюча дата (30 лютого)
5- ID: неіснуючий, рядок замість числа4. Тестування response body
1- Всі очікувані поля присутні
2- Типи даних правильні (string/number/boolean/array)
3- Немає зайвих чутливих полів (паролі, внутрішні ID)
4- Формат дат відповідає специфікації (ISO 8601)
5- Пагінація працює коректноПрактика в Postman: покроковий приклад
Крок 1: Створення колекції
Відкрийте Postman → New Collection → "QA Roadmap API Tests"
Крок 2: Налаштування змінних середовища
1Environment: Staging
2Variables:
3 base_url: https://api.staging.example.com
4 token: (поки порожнє, заповнимо після логіну)Крок 3: Запит логіну з автоматичним збереженням токена
1// POST {{base_url}}/auth/login
2// Body:
3{
4 "email": "test@example.com",
5 "password": "testpass123"
6}
7
8// Tests (Postman script):
9const response = pm.response.json();
10
11pm.test("Status 200", () => pm.response.to.have.status(200));
12pm.test("Has access token", () => pm.expect(response.access_token).to.be.a('string'));
13
14// Зберігаємо токен для наступних запитів
15pm.environment.set("token", response.access_token);Крок 4: Запит зі збереженим токеном
1// GET {{base_url}}/api/users/me
2// Headers: Authorization: Bearer {{token}}
3
4// Tests:
5const user = pm.response.json();
6
7pm.test("Status 200", () => pm.response.to.have.status(200));
8pm.test("Has ID", () => pm.expect(user.id).to.be.a('number'));
9pm.test("Has email", () => pm.expect(user.email).to.be.a('string'));
10pm.test("No password field", () => pm.expect(user.password).to.be.undefined);
11pm.test("Response time < 500ms", () => pm.expect(pm.response.responseTime).to.be.below(500));Крок 5: Тест негативного сценарію
1// GET {{base_url}}/api/users/99999 (неіснуючий ID)
2// Headers: Authorization: Bearer {{token}}
3
4// Tests:
5pm.test("Status 404", () => pm.response.to.have.status(404));
6pm.test("Error message present", () => {
7 const response = pm.response.json();
8 pm.expect(response.message).to.be.a('string');
9});Читання API документації (Swagger)
Більшість сучасних API мають Swagger (OpenAPI) документацію. Зазвичай доступна за /swagger або /api/docs.
Що знайдете в Swagger:
- Всі доступні ендпоінти
- Методи і параметри
- Схеми request/response body
- Які поля обов'язкові
- Типи даних
Порада: Swagger — ваша специфікація для тест-кейсів. Кожен ендпоінт = мінімум happy path + кілька негативних сценаріїв.
Тестування пагінації
Пагінація часто приховує баги:
1# Базовий запит
2GET /api/users?page=1&per_page=10
3
4# Що перевіряти:
5# 1. Кількість об'єктів у відповіді = per_page (або менше на останній сторінці)
6# 2. page=1 і page=2 повертають різні дані
7# 3. Загальна кількість сторінок коректна: ceil(total / per_page)
8# 4. Остання сторінка: об'єктів <= per_page
9# 5. page=999 (після останньої): порожній масив або 404, не 500Тестування сортування і фільтрації
1GET /api/users?sort=created_at&order=desc
2
3# Перевірки:
4# created_at першого елемента >= created_at другого
5# sort=invalid_field → 400, а не 5001GET /api/products?category=electronics&min_price=100&max_price=500
2
3# Перевірки:
4# Всі повернуті продукти мають category=electronics
5# Ціна кожного: 100 <= price <= 500
6# min_price > max_price → 400 з описом помилкиПриклад повного тест-плану для одного ендпоінту
1Ендпоінт: POST /api/orders
2
3Позитивні:
4TC01: Створення замовлення з валідними даними → 201, повертає ID
5TC02: Замовлення зберігається в БД (GET /orders/{id} повертає ті ж дані)
6
7Авторизація:
8TC03: Без токена → 401
9TC04: З expired токеном → 401
10TC05: З токеном user без ролі → 403 (якщо є роль)
11
12Валідація:
13TC06: Порожній масив products → 422 + повідомлення
14TC07: product_id = неіснуючий ID → 422 + повідомлення
15TC08: quantity = -1 → 422 + повідомлення
16TC09: quantity = 0 → 422 + повідомлення
17TC10: Дуже велика кількість товарів → обробляється без 500
18
19Edge cases:
20TC11: Дублікат замовлення (повторний запит) → 409 або ідемпотентна відповідь
21TC12: Одночасні замовлення від одного user → коректна обробкаПідсумок
API тестування — не складно якщо є структура. Основа: розуміти HTTP, вміти читати документацію і систематично перевіряти happy path + негативні сценарії + edge cases.
Починайте з реального API: знайдіть публічне API (GitHub API, JSONPlaceholder, PetStore) і попрактикуйтесь. 2-3 години практики в Postman дадуть більше ніж тиждень читання теорії.