<style>.lazy{display:none}</style>Тестирование API в Cypress

Тестирование API в Cypress

Если вы когда-либо тестировали API с помощью Postman или другого инструмента, то эта статья будет для вас просто находкой. Cypress – это отличный инструмент тестирования, который также может быть очень полезен при тестировании API. В этой статье мы поговорим о том, как написать API-тест в Cypress.

Содержание

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

Команда .request()

Эта команда будет являться центром всех действий. Чтобы отправить простой запрос с помощью метода GET, можно вызвать ее следующим образом:

cy.request('/api/boards')

Обратите внимание, что на самом деле вам не нужно добавлять метод. Cypress оптимизирует свои команды для максимальной читабельности, поэтому, если вы напишете такой запрос, он автоматически будет с методом GET.

Если вы передадите два аргумента в команду .request(), то первый будет считаться методом, а второй – URL-адресом.

cy.request('DELETE', '/api/boards/9873789121')

Кроме того, здесь не указан полный URL-адрес. Это связано с тем, что /api/boards будет автоматически добавляться ко всему, что определено как baseUrl в cypress.json.

Команда .request() может принимать максимум 3 аргумента. Третий будет являться телом запроса.

cy.request('POST', '/api/boards', {
  name: 'space travel plan'
})

Этот простой синтаксис очень полезен, когда вы хотите отправить несколько запросов в свою базу данных, чтобы быстро настроить данные для теста пользовательского интерфейса.

Передача нескольких атрибутов в команду .request()

Если вы хотите передать еще несколько параметров или просто предоставить вашей команде .request немного больше контекста, вы можете передать один объект. Тот же самый запрос из предыдущего примера можно записать следующим образом:

cy.request({
  method: 'POST', 
  url: '/api/boards', 
  body: {
    name: 'space travel plan'
  }
})

Это также дает возможность передавать дополнительные параметры, например, заголовки:

cy.request({
  method: 'GET', 
  url: '/api/boards', 
  qs: {
    starred: 'true'
  },
  headers: {
    accept: 'application/json'
  }
})

Получение данных из запроса

После того, как запрос получил ответ от сервера, вы можете получить доступ к информации с помощью команды .then(). При этом будут возвращены всевозможные атрибуты: тело ответа, код состояния, длительность ответа и т.д.

cy.request({
  method: 'POST', 
  url: '/api/boards', 
  body: {
    name: 'space travel plan'
  }
}).then( (board) => {

  console.log(board.status) // 201
  console.log(board.duration) // 11
  console.log(board.body) 
/* 
  { 
    "name": "new board",
    "id": 39871447524,
    "starred": false,
    "created": "2022-01-17"
  }
*/
})

Псевдоним board, используемый в качестве параметра в нашей функции .then() , на самом деле можно пропустить, если использовать деструктуризацию.

cy.request({
  method: 'POST', 
  url: '/api/boards', 
  body: {
    name: 'space travel plan'
  }
}).then( ({ status }) => {
  console.log(status) // 201
})

Таким образом вам не придется создавать именованный псевдоним каждый раз, когда вы хотите получить какие-то данные из запроса.

Данные о результатах тестирования

Теперь, когда мы получили данные с нашего сервера, можно приступить к их тестированию. В комплект Cypress входит библиотека chai, которую можно использовать внутри команды .then().

cy.request({
  method: 'POST', 
  url: '/api/boards', 
  body: {
    name: 'space travel plan'
  }
}).then( ({ status }) => {
  expect(status).to.eq(201)
})

Тело ответа обычно хранится в формате JSON. Это означает, что если вы хотите найти в ответе конкретный элемент и протестировать его, вам необходимо найти соответствующий путь. Простой пример выглядит примерно так:

cy.request({
  method: 'GET', 
  url: '/api/boards', 
}).then( ({ body }) => {
  
  expect(body).to.have.length(2) // check number of items 
  expect(body[0].name).to.eq('space travel plan') // check first item in array

})

Вы можете проверять различные атрибуты ответа API, поскольку поставляемая в комплекте библиотека chai достаточно универсальна. Например, можно проверить, имеет ли возвращаемое содержимое правильный тип, содержит ли оно определенные элементы, или написать собственную функцию для проверки значения.

cy.request({
  method: 'GET', 
  url: '/api/boards', 
}).then( ({ body }) => {
  
  expect(body.length).to.be.greaterThan(1) // more than 1 item is in list
  expect(body[0].name).to.be.a('string') // the text 'space travel plan' is a string
  expect(body[0].id).to.satisfy((num) => { return num > 0 }) // id must be bigger than 0

})

Использование плагина cypress-plugin-api

Cypress будет открывать браузер при каждом запуске теста, что следует иметь в виду, если вы решили использовать его для тестирования API. Кроме того, для изучения деталей ответа Cypress необходимо открыть консоль браузера.

Но с плагином cypress-plugin-api запрос и ответ выводятся в окно браузера, поэтому вы можете легко наблюдать за работой вашего API даже в режиме GUI. Этот плагин добавит в вашу библиотеку Cypress команду .api(), синтаксис которой очень похож на команду .request().

cy
  .api({
    method: 'POST', 
    url: '/api/boards', 
    body: { name: 'new board' }
  })

После этого в тесте появится красивый рендер:

Рендер в тесте после применения плагина cypress-plugin-api

Надеемся, вам понравилась эта статья.

Перевод статьи «Cypress basics: API testing».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *