Тестування серверного API за допомогою Cypress
Вітаю шановне панство
Наперед прошу вибачення за відсутність програмного коду у цій статті. Причиною є проблема з форматуванням під час його вставки. Копії екрану з кодом у данному випадку це найгірший варіант. У тексті є посилання на першоджерело де ви зможете побачити код гарно відформатованим. Дякую за коментарі.
Які інструменти для тестування api ви знаєте і якими користуєтесь під час розробки? Більшість мабуть назве Postman. Так, це досить поширений і загально відомий інструмент. Хтось скаже що це jMeter, Fiddler, SoapUI, Advanced REST Client.
Я хочу запропонувати вам Cypress. Так, той самий Cypress який розробники веб застосунків використовують для End2end тестування і рідше для тестування React/Vue/Angular/Svetle компонентів. Особливо зручно буде тим хто створює API на Nodejs, адже Cypress використовує JavaScript. Cypress це дуже гнучкий інструмент за допомою якого можна автоматизувати будь-які дії з перевірки як клієнтського так і серверного коду. Cypress максимально імітує робоче середовище для викликів api бо запускає скрипти для тестування беспосередньо з браузера, який, до речі, ви можете вибрати.
Як встановити і розпочати працювати з Cypress ви легко знайдете за цим посиланням. Зараз я пропоную зупинитись на моментах які мало описані в інтернеті. А саме на тестуванні серверних інтерфейсів які потребують авторизації.
Для прикладу api яке потрібно реалізувати і відповідно тестувати під час розробки візьмемо серверну реалізацію базовану на Firebase Callable function і захищену за допомогою Firebase Authentication (що насправді є Google Identity Toolkit загорнутим у Firebase). На реалізації безпосередньо api ми зупинимось іншим разом. Зараз нас цікавить як його перевіряти на відповідність вимогам.
Використовуючи наведену нижче реалізацію є можливість тестувати серверні інтерфейси від імені будь-якого зареєстрованого у веб застосунку користувача
Cypress скрипт
Код безпосередньо Cypress скрипта який тестує точку входу в api getList
Цей шматочок коду я копіпастив построчно. Як кажуть — вода камінь точить :)
describe('Users API Requests', () => {
context.only('getList', () => {
it('Success / for Admin', () => {
cy.userApi("getList")
.then((response) => {
expect(response.status).to.eq(200)
})
})
})
})
Cypress команди
Допоміжний код оформлений у вигляді двох Cypress команд для запезпечення зручності програмування і читабельності програмного коду.
- userApi — основна команда, яка викликає getIdTokenForAdmin для отримання IdentityToken і формування HttpsCallable запиту на сервер, використовуючи параметр action що у нашому випадку є getList
- getIdTokenForAdmin — допоміжна команда для отримання IdentityToken для користувача userEmailAdmin. Цікавий приклад імплементації кешу. Якщо токен формувався раніше то повторне формування оминається.
Cypress Firebase plugin
Ця частина коду виконується під час запуску Cypress у Nodejs (не в браузері). Це важливо для розуміння бо дає можливість запускати firebase-admin і отримати доступ до управління Firebase проектом на сервері. З браузера (де виконуються Cypress скрипти) це зробити не можливо.
cypress/support/firebase-plugin.js
Рекомендації
- Перше і найголовніше — починайте писати тести одноразово з написанням першого коду api.
- Для розробки обов’яково використовуйте Firebase Emulator, або у вашому випадку будь-що що дає змогу запустити і тестувати api локально. Це значно прискорить і спростить для вас процес розробки.
- Створіть як мінімум один тест для кожної точки входу в api (Happy path per api endpoint)
- Пишіть тести для усіх найбільш критичних варіантів у які може потрапити система. Наприклад, перевірка того що api дійсно видає помилку коли ним намагається скористатися неавторизований на цю дію користувач. (Unhappy pathes)
Увесь код що надано вище є робочим і використовується у реальних системах.
4 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів