Тестування серверного API за допомогою Cypress

💡 Усі статті, обговорення, новини про тестування — в одному місці. Приєднуйтесь до QA спільноти!

Вітаю шановне панство

Наперед прошу вибачення за відсутність програмного коду у цій статті. Причиною є проблема з форматуванням під час його вставки. Копії екрану з кодом у данному випадку це найгірший варіант. У тексті є посилання на першоджерело де ви зможете побачити код гарно відформатованим. Дякую за коментарі.

Які інструменти для тестування 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/e2e/backend/users-api.cy.js

Cypress команди

Допоміжний код оформлений у вигляді двох Cypress команд для запезпечення зручності програмування і читабельності програмного коду.

  • userApi — основна команда, яка викликає getIdTokenForAdmin для отримання IdentityToken і формування HttpsCallable запиту на сервер, використовуючи параметр action що у нашому випадку є getList
  • getIdTokenForAdmin — допоміжна команда для отримання IdentityToken для користувача userEmailAdmin. Цікавий приклад імплементації кешу. Якщо токен формувався раніше то повторне формування оминається.

cypress/support/commands.js

Cypress Firebase plugin

Ця частина коду виконується під час запуску Cypress у Nodejs (не в браузері). Це важливо для розуміння бо дає можливість запускати firebase-admin і отримати доступ до управління Firebase проектом на сервері. З браузера (де виконуються Cypress скрипти) це зробити не можливо.

cypress/support/firebase-plugin.js

Рекомендації

  1. Перше і найголовніше — починайте писати тести одноразово з написанням першого коду api.
  2. Для розробки обов’яково використовуйте Firebase Emulator, або у вашому випадку будь-що що дає змогу запустити і тестувати api локально. Це значно прискорить і спростить для вас процес розробки.
  3. Створіть як мінімум один тест для кожної точки входу в api (Happy path per api endpoint)
  4. Пишіть тести для усіх найбільш критичних варіантів у які може потрапити система. Наприклад, перевірка того що api дійсно видає помилку коли ним намагається скористатися неавторизований на цю дію користувач. (Unhappy pathes)

Увесь код що надано вище є робочим і використовується у реальних системах.

Першоджерело

omnigon.com.ua/...​kend-api-test-cypress/ua

👍ПодобаєтьсяСподобалось4
До обраногоВ обраному3
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Ваш тест може бути «зеленим», навіть якщо буде помилка, бо не обробляються всі стейти промісу з cy.userApi().

Або додайте .catch і фейліть тест, або переробіть на async/await.

Богдане, дякую за коментар

Cypress — це окрема планета створена на JS але яка має свої власні закони. Твердження про використання catch є поширеною помилкою розробників на початку знайомства з Cypress ...

Більш детально з посиланнями тут omnigon.com.ua/...​ess/ua/#question-from-dou

Норм. На Доу не вистачає блюючого смайлику для подібних випадків. :)

Гарна аналогія.
Дякую що розумієте.

Підписатись на коментарі