1

Тема: Як правильно тестувати REST API з базою даних?

Вітаю.
Я не можу зрозуміть принципи тестування API, в котрому використовується база даних.

Уявіть собі такий випадок: у нас є список продуктів, що збережені в базі даних. Кожен продукт має якісь параметри, і у нас є API, котрий дозволяє отримати якийсь один продукт, або декілька продуктів, які мають певні параметри.

Нехай у нас є таблиця з продуктами, схожими на цей

id: '1',
name: 'nlaw',
type: 'Anti-tank guided missile',
price: 40000,
description: 'робить смерть москалям'

Подібних продуктів у нас є багато, типи продуктів різні, і ціни різні. І ми робимо запит штибу такого

SELECT * FROM products WHERE type='Anti-tank guided missile' AND price < 100000

тобто, знайти всі продукти типу Anti-tank guided missile і ціною меншою за 100000.

Тепер я б хотів написати тест для цього запиту.
Я можу використати якусь бібліотеку, котра дозволяє симулювати http запит, як от цей

GET https://api.my.com/products?type='Anti-tank guided missile'&price[lt]=100000

А шо маж відбуватись далі? Підключатися до реальної бази даних? Мати якусь локальну базу даних у вигляді звичайного JSON файлу? Але ж тоді дані можуть бути відмінними від тих, що є в реальній базі даних, а нам треба перевірити, чи той запит поверне необхідні дані?
Шо робить в цьому випадку?

2

Re: Як правильно тестувати REST API з базою даних?

Найперший тест який має здійснюватися щодо REST API - це чи розробник не полінувався правильно оформити обробку помилок.

Бо якщо наприклад зробити запит

GET https://api.my.com/products?some_parameter1='abc'

то по ідеї повинна бути відповідь

some_parameter1 does not exist

Чи скажімо параметр price очікує лише інтеджер, а ми йому надішлемо варчар

GET https://api.my.com/products?price[lt]='qwr'

по ідеї повинна бути помилка щось типу

datatype mismatch for price

Але на жаль, бувають випадки коли error handling не виконано взагалі або ж не передбачено основних випадків, тоді повертається тупо

500 internal server error

і сказати в чому саме була помилка може лише адмін в якого є доступ до логів помилок веб сервера (і то ще у кращому випадку, якщо це логується на рівні веб сервера).

Тепер я б хотів написати тест для цього запиту.

А тут вже - "вільному воля", пишіть які завгодно тести відповідно до власної фантазії, якщо в таску не внесли acceptance criteria. Скажімо, ми точно знаємо що певний запит повинен повертати не менше трьох рядків, отже отримуємо json, парсимо його і якщо рядків менше трьох, тоді тест повинен зафейлитися.

3 Востаннє редагувалося frz (12.04.2022 16:19:33)

Re: Як правильно тестувати REST API з базою даних?

Підключатися до реальної бази даних?

Пропоную відкрити для себе таке поняття як postgrest - це конфігурація котра дозволяє перетворити локальну базу postgres на сервер rest api. Якщо це й не ідеально для тестування, то точно найшвидший спосіб отримати майже повноцінне середовище для вивчення.

4

Re: Як правильно тестувати REST API з базою даних?

frz написав:

Підключатися до реальної бази даних?

Пропоную відкрити для себе таке поняття як postgrest - це конфігурація котра дозволяє перетворити локальну базу postgres на сервер rest api. Якщо це й не ідеально для тестування, то точно найшвидший спосіб отримати майже повноцінне середовище для вивчення.

Нащо мені ще один rest api? В мене вже є свій.

5 Востаннє редагувалося frz (12.04.2022 16:29:01)

Re: Як правильно тестувати REST API з базою даних?

FakiNyan написав:
frz написав:

Підключатися до реальної бази даних?

Пропоную відкрити для себе таке поняття як postgrest - це конфігурація котра дозволяє перетворити локальну базу postgres на сервер rest api. Якщо це й не ідеально для тестування, то точно найшвидший спосіб отримати майже повноцінне середовище для вивчення.

Нащо мені ще один rest api? В мене вже є свій.

Тоді уточніть чого саме ви очікуєте добитися. З першого допису незрозуміло було до кінця, чи є вже цей сервер чи ще ні.
Але на жаль, щоб вірно запитати питання, потрібно знати половину відповіді.
Тестування - це окремий напрямок, який мені особисто не рідний, але я знаю що тут потрібна креативність і вміння випробувати функціонал з тієї точки зору, з якої девелопер не передбачив.

6

Re: Як правильно тестувати REST API з базою даних?

залежно від того фреймворк чи з нуля писали? Фреймворки мають якісь свої рішення з коробки, напр django - сам вміє створювати тестову БД, наповнювати їх даними і симулювати обробку http запитів.

Якщо ж нема, то:
1. можна замокати запити до БД, і симулювати різні кейси (це буде чисто юніт тестування) - http запитів не буде;
2. можна, створювати тестову БД якоюсь командою, типу `./main.js test` і піднімати http server і тоді іншим процесом копати його. Інтеграційні тести тоді вже. Чесно ніколи не бачив такого, швидше вже стейджинг

Подякували: FakiNyan1

7

Re: Як правильно тестувати REST API з базою даних?

Q-bart написав:

залежно від того фреймворк чи з нуля писали? Фреймворки мають якісь свої рішення з коробки, напр django - сам вміє створювати тестову БД, наповнювати їх даними і симулювати обробку http запитів.

Якщо ж нема, то:
1. можна замокати запити до БД, і симулювати різні кейси (це буде чисто юніт тестування) - http запитів не буде;
2. можна, створювати тестову БД якоюсь командою, типу `./main.js test` і піднімати http server і тоді іншим процесом копати його. Інтеграційні тести тоді вже. Чесно ніколи не бачив такого, швидше вже стейджинг

там, де я пишу, є можливість симулювати http запити без запуску самого серверу.

8

Re: Як правильно тестувати REST API з базою даних?

FakiNyan написав:
Q-bart написав:

залежно від того фреймворк чи з нуля писали? Фреймворки мають якісь свої рішення з коробки, напр django - сам вміє створювати тестову БД, наповнювати їх даними і симулювати обробку http запитів.

Якщо ж нема, то:
1. можна замокати запити до БД, і симулювати різні кейси (це буде чисто юніт тестування) - http запитів не буде;
2. можна, створювати тестову БД якоюсь командою, типу `./main.js test` і піднімати http server і тоді іншим процесом копати його. Інтеграційні тести тоді вже. Чесно ніколи не бачив такого, швидше вже стейджинг

там, де я пишу, є можливість симулювати http запити без запуску самого серверу.

ну то файно, тоді має бути можливість створювати тестову БД, і мають бути якісь варіанти для наповнення цієї тестової бд даними:
1. fixtures - дані тримати в файликах напр, при створенні тестової бд читати їх і наповнювати БД;
2. при старті кожного тесту - створювати потрібні дані. Ну мали б бути бібіліотеки фабрики, щоб наповнювати дані автоматично (напр викликаєш User() і тобі автоматично додається запис в БД, з рандомними значеннями для цього юзера)

9

Re: Як правильно тестувати REST API з базою даних?

так на чому ви це пишете?

10

Re: Як правильно тестувати REST API з базою даних?

Q-bart написав:

залежно від того фреймворк чи з нуля писали? Фреймворки мають якісь свої рішення з коробки, напр django - сам вміє створювати тестову БД, наповнювати їх даними і симулювати обробку http запитів.

помилився: симулювати обробку надсилання http запитів

11

Re: Як правильно тестувати REST API з базою даних?

Q-bart написав:
FakiNyan написав:
Q-bart написав:

залежно від того фреймворк чи з нуля писали? Фреймворки мають якісь свої рішення з коробки, напр django - сам вміє створювати тестову БД, наповнювати їх даними і симулювати обробку http запитів.

Якщо ж нема, то:
1. можна замокати запити до БД, і симулювати різні кейси (це буде чисто юніт тестування) - http запитів не буде;
2. можна, створювати тестову БД якоюсь командою, типу `./main.js test` і піднімати http server і тоді іншим процесом копати його. Інтеграційні тести тоді вже. Чесно ніколи не бачив такого, швидше вже стейджинг

там, де я пишу, є можливість симулювати http запити без запуску самого серверу.

ну то файно, тоді має бути можливість створювати тестову БД, і мають бути якісь варіанти для наповнення цієї тестової бд даними:
1. fixtures - дані тримати в файликах напр, при створенні тестової бд читати їх і наповнювати БД;
2. при старті кожного тесту - створювати потрібні дані. Ну мали б бути бібіліотеки фабрики, щоб наповнювати дані автоматично (напр викликаєш User() і тобі автоматично додається запис в БД, з рандомними значеннями для цього юзера)

Наповнювати базу даних даними проблєм нема. Пишу на ноді, я ж жабаскриптер. Але от в якості бази даних використовую postgres.
Загалом, якшо це робити так, як ви кажете, то проблєм бути не має. Але я так розумію, що це трохи різні види тестування.

Якщо розробляти застосунки через створення тестів (test driven development), то ніби треба, аби тести запускались кожного разу, коли ми шось змінюємо в коді. Але якшо кожного разу треба буде створювати базу, наповнювати її, і тільки тоді запускати тести, то кожна найменша зміна коду займатиме достатньо часу, аби процес розробки був геть не файним.

Мабуть, є сенс розділяти тести на швидкі - юніт тести з замоканими даними, і довгі - котрі запускаються не під час розробки, а під час розгортання коду в розробницькому і виробничому середовищі.

Тобто, лише коли ми заливаємо код в певну гілку репозиторію - запускається процес автоматичного розгортання застосунку, в межах котрого створюватиметься тимчасова база даних, наповнюватиметься даними, а потім вже запускатимуться тести. При цьому ми можемо використовувати одні й ті ж самі тести, і в залежності від значень певних змінних середовища ці тести будуть або використовувати локальні замокані дані у вигляді якихось JSON файлів, або ж підключатись до бази даних, і використовувати дані вже з неї.

Тоді ще виникає питання, а шо ми тестуємо, якщо дані так і так будуть правильними, адже ми не будемо заносити в тимчасову базу даних неправильні дані? А ми будемо тестити саме SQL команди, бо в локальних тестах вони виконуватися не будуть, адже ми будемо просто мокати результат їх виконання.

12

Re: Як правильно тестувати REST API з базою даних?

FakiNyan написав:

там, де я пишу, є можливість симулювати http запити без запуску самого серверу.

Це вже цікаво, почнімо розбиратися.
З одного боку, має бути клієнт, який симулює HTTP запити. Загалом він не залежить від сервера, йому байдуже чи існує сервер. З іншого боку, якщо сервера нема, то й тестувати функціонал нема на кому. Тобто сам процес відправки запитів має сенс тільки якщо сервер існує.
Чи як ?

FakiNyan написав:

Подібних продуктів у нас є багато, типи продуктів різні, і ціни різні. І ми робимо запит штибу такого

SELECT * FROM products WHERE type='Anti-tank guided missile' AND price < 100000

тобто, знайти всі продукти типу Anti-tank guided missile і ціною меншою за 100000.

Штибу такого, але прям вот так не можна. Замість * буде список полів + limit N.

13

Re: Як правильно тестувати REST API з базою даних?

ну, бляха, коли приходе запит від клієнта, воно ж представлене певним об'єктом, який містить в собі інфу про те, які там параметри, чи дані були відправлені. От цей об'єкт і створюється, і передається в обробник, який то все обробляє, витягує дані з запиту, і шось з ними робе.

Подякували: leofun011

14

Re: Як правильно тестувати REST API з базою даних?

Щось контекст питання і відповідей не можу зрозуміти :) Для себе профілювання/тестування проводжу через https://sentry.io Може питання про Insomnia чи POSTMAN ?)
Написати пресет для тестування апі, вказати параметри (кількість запитів, відповіді, і т.д.) запустити і дивитись як твоє апі реагує на навантаження. В багатьох фреймворках є свої екосистеми(адаптації) по тестуванню на будь який смак (в ларавель є пакети  для цього). Можливо варіант таки згенерити базу з потрібними/правильними даними і її підключати в тестуванні, де завідомо визначені коректні відповіді, все ж раз описати і потім перевіряти роботу сервісу.

Подякували: leofun011