Разбор переменных и скриптов в Insomnia

Автор: Надежда Дудник

Памятка для инженеров по тестированию ПО.

Продолжаю серию своих статей про Insomnia, первую статью можно прочитать по ссылке.

Сейчас хочу поделиться разбором динамических переменных и показом примера скриптов с использованием Chains.

Введение

Insomnia — инструмент для тестирования API (клиент взаимодействия с API).

Для примера я буду использовать сайт Vikunja и еще другие примеры.

UI:  https://try.vikunja.io/login

API documentation:  https://try.vikunja.io/api/v1/docs

Скачать готовую коллекцию для данного сайта, которую составляли по написанным тест-кейсам API в рамках статьи.

На момент написании статьи используется версия Insomnia: 8.6.0 для Windows.

Base Environment

Начну показывать переменные через созданное окружение «Vikunja Environment».

Всевозможные переменные

Всевозможные переменные

Структуру переменных для сайта Vikunja можно выстроить в формате JSON.

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

Переменные для сайта Vikunja в Manage Environments (композиция переменных в JSON структуре)

Переменные для сайта Vikunja в Manage Environments (композиция переменных в JSON структуре)

{
	"hosts": {
		"base_URL": "https://try.vikunja.io/api/v1",
		"sm_URL": ""
	},
	"headers": {
		"content-type": "application/json"
	},
	"users": {
		"username": "Nadezhda_test1",
		"email": "user_testing1@test.com",
		"password": "Qq1234568"
	},
	"auth": {
		"Token": "Response -> Body Attribute"
	},
	"projects": {
		"project_Id": "Response -> Body Attribute",
		"title": "project_title",
		"hex_color": "7f23ff"
	},
	"tasks": {
		"task_Id": "Response -> Body Attribute",
		"title_task": "title_task"
	},
	"labels": {
		"label_Id": "Response -> Body Attribute"
	}
}

Динамические переменные

Динамические переменные в Insomnia

Динамические переменные в Insomnia

+ еще переменные

+ еще переменные

Переменные из Response и Request

Переменные из Response и Request

Переменные из Request

Переменные из Request

Разберу несколько из выше показанных переменных.

Чтобы отобразился список переменных, важно указать начало поиска, например, чтобы найти «UUID» переменную для ключа достаточно ввести «u», и затем отобразится список переменных, где встречается буква «u».

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

Объявление динамических переменных в теле запроса

Объявление динамических переменных в теле запроса

Значение переменной можно увидеть, нажав на данную выбранную переменную, и откроется всплывающее окно «Edit Tag».

  1. UUID → Version — генерация UUID — значения

    uuid

    uuid

  2. Timestamp — get the current time

    timestamp

    timestamp

  3. Base64 — encode or decode values — для URL

    a968256be160d4169edb182bd4bdb5dd.png
  4. OS — get OS info — всевозможные функции

    Характеристика OS

    Характеристика OS

  5. Использование JSONPath

    Определение значения из JSON string

    Определение значения из JSON string

  6. Hash — apply hash to a value для Base64

    b65db503fcf9623d9773276fa039ec39.png
  7. Из ответа от сервера Response можно «вытащить» следующие значения:

    1547ea8b910d11b6e998fd3990acc866.png
    • Значение из тела ответа от сервера

      9da345ee91fe804638c04c68470a5eb4.png
    • Тело ответа от сервера

      6ec19b7862b8e0139f09360f341e1bea.png
    • Значение заголовка из ответа сервера

      322a81cdd0dec0e6c99ff78c86de459a.png
    • URL-адрес инициирующего запроса

      23b3387dca1c4c1d859e5d5dfe918ea1.png
  8. Из запроса Request можно «вытащить» следующие значения:

    695f4fe410bbab39307b1861533d9648.png

    URL-адрес инициирующего запроса

    1. Например, Значение заголовка из запроса

      3a3869a0f0154b502fbba0d49d68f999.png
    2. Значение Cookie по названию

      a51960fcae6afe0dbecaa67c6bbda531.png

      и т.д.

      Также отдельно есть прочтение содержимого из файла, использование входных данных для пользователя. Я разобрала те переменные, которые часто используются в работе, особенно используется «Body Attribute — value of response body»

Вкладка Tests → New Test Suite → New Test

Примеры скриптов для регистрации пользователя для сайта Vikunja c использованием chaijs

Написание скриптов для запроса регистрации пользователя на вкладке Tests

Написание скриптов для запроса регистрации пользователя на вкладке Tests

const response2 = await insomnia.send('req_0ca37b8e2a0f40a7a610250ef48f4697'); 
//отправка запроса POST /register

expect(response2.status).to.equal(200) // проверка статус кода

const res_body = JSON.parse(response2.data)//парсинг тела ответа от сервера на язык js
console.log(res_body)//отображение тела ответа от сервера в консоли

expect(res_body).to.be.an('object')//тело ответа от сервера является объектом
expect(res_body.username).to.be.a('string')//значение ключа username является строкой
expect(res_body.username).not.has.length(0)//ключ username не пустой

expect(res_body.email).to.be.a('string')
expect(res_body.email).not.has.length(0)

const expected_keys = [
	"id",
	"name",
	"username",
	"email",
	"created",
	"updated"
]
//Проверка ожидаемых ключей в теле ответа от сервера
expect(res_body).to.have.all.keys(expected_keys)

expect(res_body.username).to.equal("<Указать значение из окружения>")
expect(res_body.email).to.equal("<Указать значение из окпужения>")

Хочу отметить, что можно выбрать запрос через «Select a request», а можно отправить запрос внутри самого теста.

Например, я указываю так:

Отправка запроса внутри теста вместо поля

Отправка запроса внутри теста вместо поля «Select a request»

Примеры скриптов для авторизации пользователя

const response2 = await insomnia.send('req_c6319e16d41a4ed593fec04d92f7183c');
//отправка запроса POST /login
expect(response2.status).to.equal(200);

const res_body = JSON.parse(response2.data)
console.log(res_body)
expect(res_body).to.be.an('object')

expect(res_body.token).to.be.a('string')//значение ключа token является строкой
expect(res_body.token).not.has.length(0)
console.log(res_body.token)

Примеры скриптов для создания проекта пользователем на сайте (Create Project)

const response2 = await insomnia.send('req_b8be8c6b91e24343af7e2c1ae1ffa7fc');
//отправка запроса PUT /projects

expect(response2.status).to.equal(201);

const res_body = JSON.parse(response2.data)
console.log(res_body)
expect(res_body).to.be.an('object')

expect(res_body.id).to.be.a('number')
expect(res_body).to.have.property('id')
expect(res_body.id).to.equal(<Указать ожидаемое значение>)
console.log(res_body.id)

//примеры
expect(res_body.title).to.be.a('string')
expect(res_body.owner.username, "поле username должно быть строкой").to.be.a('string')

expect(res_body.is_archived).to.equal(false)

Примеры скриптов для получения всех проектов Get all Projects

const response2 = await insomnia.send('req_716ace9255e34ac1970bfc7571dc6ab0');
//отправка запроса GET /projects
expect(response2.status).to.equal(200);

const res_body = JSON.parse(response2.data)
const project_id1 = res_body[0].id
console.log(project_id1)

//для примера - и то эксперимент
const expected_colors = ["7f23ff"]
const actual_colors = res_body.map(item => item.hex_color)
expect(actual_colors).to.include.members(expected_colors)
console.log(actual_colors)

Из https://www.chaijs.com/api/bdd/ и https://docs.insomnia.rest/insomnia/unit-testing можно использовать различные конструкции, чтобы составить свои проверки на вкладке tests.

Заключение

В будущем хочу затронуть тему разработки плагина для Insomnia. Я на пути изучения, чтоб также поделиться своим опытом использования плагинов.

Также я предлагаю просмотреть мой вебинар на тему «Тестирование API с использованием Insomnia»

Благодарю за просмотр и прочтение.

С уважением, Надежда Дудник (protestinginfo), главный инженер по тестированию в финтехе и ментор по тестированию ПО.

И желаю достичь своей цели!

© Habrahabr.ru