Что такое API?
API (Application Programming Interface) – в переводе на русский – интерфейс для программирования приложений. Интерфейсом обычно называют “общую границу” двух систем, через которую они взаимодействуют. В нашем случае, интерфейс разработки приложений позволяет обмениваться данными между клиентом и сервером посредством специальных запросов. Архитектурный стиль, используемый в Api платформы Synergy называется REST (Representational State Transfer - “Передача состояния представления”). Его особенность в том, что сервер не запоминает состояние пользователя между запросами – в каждом запросе передается информация идентифицирующая пользователя (например, параметры авторизации) и все остальные параметры необходимые для работы запроса.
Взаимодействие в REST архитектуре осуществляется множеством видов запросов, основные:
- На получение информации – GET,
- Добавление информации – POST,
- Модификация, изменения данных – PUT,
- Удаление – DELETE
В платформе Synergy используются в основном GET и POST запросы. Их можно использовать как и для удаления, так и для изменения, так и для всего остального. Формат данных для обмена – JSON.
Как тестировать API?
Тестировать API достаточно просто – нужно проверить, соответствует ли результат, который мы ожидали увидеть действительности. Проверить статус, json-тело ответа, сообщения, равенство переменных и т. д. Например, мы делаем запрос не указывая параметры авторизации – мы ожидаем, что сервер ответит ошибкой 401 с сообщением “Отсутствуют параметры авторизации”. На такой запрос можно написать два теста: Первый: сверить статус ответа, который вернулся. Если он отличен от 401 – где-то есть баг. Второй тест — проверка текста сообщения. Можно сверять объекты, их значения и так далее. Для каждой API необходимо минимум столько запросов, сколько возможных вариантов ответа она может вернуть. Например, для запроса «rest/api/person/auth», который авторизует пользователя необходимо написать следующие тесты:
- на случай успешного прохождения запроса:
- проверка статуса 200,
- проверка тела ответа на достоверность.
- на случай, если не переданы необходимые headerParams:
- проверка статуса 401,
- проверка сообщения и т.д.
Что такое Postman?
Postman – это инструмент, который позволяет создавать и выполнять запросы, документировать и мониторить все api сервисы в одном месте. Cкачать десктопный клиент можно здесь. Интерфейс Postman:
1 — Вкладка с Postman-коллекциями, под ней располагается кнопка для создания коллекций; 2 — список имеющихся коллекций, 3 — вкладки с запросами; 4 — конструктор запросов.
Коллекции в Postman — это группы сохраненных запросов, которые можно организовать по папкам. Подробнее про коллекции можно почитать по ссылке. Перед началом работы нужно создать коллекцию, тогда запросы не потеряются и при необходимости можно будет прогнать их в цепочке.
Для демонстрации работы конструктора запросов выполним несколько шагов:
- Написать URL запроса в соответствующее поле ( http://host-address/Synergy/rest/api/person/auth ), выбрать тип запроса GET, задать параметры авторизации.
- Нажать на кнопку отправки, посмотреть ответ, возвращенный запросом.
1 — URL и тип запроса, 2 - статус запроса, 3 — тело ответа в формате json
Под кнопкой отправки имеется кнопка Code, в ней можно посмотреть исходный код запроса на многих языках программирования:
Создание среды
При тестировании API и создания цепочек запросов возникает необходимость создания переменных для быстрого и удобного изменения данных. Переменные в Postman бывают локальные — объявляются в скриптах и видны только внутри них, глобальные — видны для всех коллекций, и переменными среды — которые видны и существуют, когда активирована эта среда. Проще всего понять, что такое среда или окружение с переменными на примере.
- Создаем среду Для создания среды необходимо кликнуть на значок шестеренки в правом верхнем углу экрана. В появившемся меню отобразится список всех имеющихся на данный момент окружений. В этом же меню можно создавать глобальные переменные, нажав на кнопку Global. Для добавления нового окружения нужно нажать ADD.
- Создаем несколько переменных Переменная, которая понадобится для любой коллекции Synergy — переменная IP. Столбцы Initial Value и Current Value отличаются между собой. Значения Initial Value будет установлено при экспорте коллекции или при делении ей между разработчиками, значение Current Value будет использовано только этим клиентом Postman.
- После создания среды с переменными ее необходимо активировать. На этом же скриншоте показано использование переменных. Они помещаются в двойные фигурные скобки (в строке URL запроса переменные {{ip}} и {{userCode}}). Далее постман сам подставит в них значения выбранной среды. Если переменные выделены красным цветом - значит такой переменной еще не существует. Если вы создавали их в среде - возможно вы забыли ее выбрать, если вы прописывали переменные в pre-request скрипте, переменные запишутся, когда вы отправите этот запрос.
Порядок выполнения запросов в Postman
Помимо самого запроса в Postman существуют еще два вида скриптов — pre-request script и tests. Pre-request script выполняется перед отправлением запросов. В нем удобно создавать и задавать значения переменным командой postman.setEnvironmentVariable(«name», «value»);
. После выполнения запроса и получения тела запроса выполняются скрипты тестов.
Теперь можно писать тесты. Будут кратко протестированы api: rest/api/registry/create_doc_rcc
, rest/api/registry/activate_doc
, rest/api/asforms/data/get
.
Все запросы необходимо сохранять в созданную ранее коллекцию. Для первого запроса ниже следует пошаговая инструкция, остальные запросы выполнить по аналогии.
Для того, чтобы запрос выполнялся корректно у вас на виртуальной машине должен существовать реестр с кодом, который вы указываете в теле (в примере mcReg) и двумя однострочными полями с кодами textbox1 и textbox2.
Для проведения тестов для проекта Synergy через Jenkins нужно использовать старый синтаксис постман тестов, на момент февраля 19г новый синтаксис не поддерживается, также не поддерживаются перменные объявленные с помощью оператора let, вместо него следует использовать var. Шаблоны и подсказки для нового синтаксиса находятся во вкладке Tests на панели SNIPPETS справа. В примерах используется старый синтаксис.
Запрос 1: POST createDocRccSuccess:
URL: http://{{ip}}/Synergy/rest/api/registry/create_doc_rcc
,
BODY:
{
"registryCode": "mcReg",
"data": [
{
"id": "textbox1",
"type": "textbox",
"value": "{{firstValue}}"
},
{
"id": "textbox2",
"type": "textbox",
"value": "{{secondValue}}"
}
]
}
Pre-Request:
postman.setEnvironmentVariable("firstValue", "Первое поле");
postman.setEnvironmentVariable("secondValue", "Второе поле");
Test
var data = JSON.parse(responseBody);
tests["errorCode должен быть : 0"] = data.errorCode === 0;
tests["код ответа 200"] = responseCode.code === 200;
postman.setEnvironmentVariable("dataUUID", data.dataID);
postman.setNextRequest("ActivateCreatedDocSuccess");
- Прописываем URL
http://{{ip}}/Synergy/rest/api/registry/create_doc_rcc
в соответствующее поле в конструкторе запросов, выбираем тип запроса POST и заполняем данные запроса в Body формата raw.
- После через Pre-request script устанавливаем значения переменных.
- Далее пишем тест в соотвествующей вкладке:
- После отправляем запрос и смотрим на тело ответа и результаты тестов:
Это успешный пример прохождения тестов. Мы получили то, что ожидали, значит багов в этом месте нет. Далее написаны коды оставшихся двух запросов цепи.
Запрос 2: GET ActivateCreatedDocSuccess
URL: http://{{ip}}/Synergy/rest/api/registry/activate_doc?dataUUID={{dataUUID}}
.
Test:
var data = JSON.parse(responseBody);
tests["errorCode должен быть : 0"] = data.errorCode === "0";
tests["код ответа 200"] = responseCode.code === 200;
postman.setNextRequest("FormDataValidationSuccess");
Объект responseBody
- это тело ответа в формате json, который парсится с помощью функции JSON.parse(responseBody);
. С его помощью можно проверять валидность данных, которые возвращает API сервис. В третьем запросе с помощью этого объекта мы проверяем, сохранились ли наши значения на форме сравнивая изначальные переменные с переменными в теле ответа.
Запрос 3: GET FormDataValidationSuccess
URL: http://{{ip}}/Synergy/rest/api/asforms/data/get?dataUUID={{dataUUID}}
.
Test:
tests["код ответа 200"] = responseCode.code === 200;
var jsonData = JSON.parse(responseBody);
let dataArray = jsonData[0].data;
console.log("dataArray: " + dataArray);
tests["Значение первого поля: " + environment.firstValue] = dataArray[0].value === environment.firstValue;
tests["Значение второго поля: " + environment.secondValue] = dataArray[1].value === environment.secondValue;
//tests["Тест должен провалиться"] = dataArray[1].value === null;
postman.setNextRequest("FormDataValidationSuccess");
После того, как все тесты для каждого запроса в отдельности прошли успешно, можно запустить коллекцию и прогнать всю цепочку запросов. Для создания этой цепочки в конце каждого теста с помощью команды postman.setNextRequest(«Request name»)
прописывается запрос, который должен выполниться следующим. Таким образом можно проводить интеграционное тестирование, тестирование скриптов интерпретатора и т. д. При выполнении запросов вне запуска коллекции эта команда игнорируется.
Для запуска всей коллекции нужно найти свою коллекцию в меню, нажать на треугольник и нажать кнопку run.
Запустится Collection Runner, в котором можно запустить все тесты коллекции цепью, посмотреть их статус и т.д.
Готовую коллекцию можно найти здесь: PostmanMasterclass.postman_collection.json
Команды Postman Tests:
1) tests[“ Название теста ”] = условие проверки (любой логический оператор или функция, котрые возвращают true/false);
пример старого синтаксиса:
tests[“Status code is 200”] = responseCode.code === 200;
пример нового синтаксиса:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
2) Значение поля header можно взять следующими способами:
postman.getResponseHeader(“header_name”);
responseHeader.hasOwnProperty(“header_name”);
3) Тело ответа находится в объекте responseBody.
responseBody.has(“Message”);
4) Сохранить значение в переменную:
окружения:
postman.setEnvironmentVariable("name", "value");
глобальную:
postman.setGlobalVariable("name", 123);
5) Получить значение переменной:
старый синтаксис:
environment.name;
global.name;
новый:
pm.environment.get("variable_key");
pm.globals.get("variable_key");
pm.variables.get("variable_key");
в новом синтаксисе можно очистить значение переменной:
pm.globals.unset("variable_key");
6) Получение тела ответа в качестве объекта:
var jsonData = JSON.parse(responseBody);