Всем привет, я руководитель отдела тестирования, и недавно по работе появилась задача на тестирование API. Для ее решения освоил новый для меня инструмент Postman и JavaScript.
Первоначально на каждый API я писал свои коллекции и готовил тестовые данные в JSON формате. Это достаточно удобно, но при большом количестве тестов и коллекций поддерживать это становится накладно. Да и проводить валидацию данных в JSON не удобно.
Для решения этих проблем я написал макрос для Excel и коллекцию в Postman. Теперь в Postman у меня одна коллекция на все API и стандартный набор функций для обработки входящих данных и валидации возвращаемых результатов. Мне удалось перенести управление тестовыми данными и последовательность выполнения запросов в Excel.
1. JSON с данными
Раньше тестовый набор хранился в таком виде
2. 2. Последовательность выполнения запросов с обработчиками на JS хранилась в коллекциях Postman.
1. Тестовый набор переехал в Excel
Все данные вносятся в Excel (управляющие ключевые символы: R, H, I и т.д. распишу ниже) и дальше при помощи макроса перегоняются в json формат:
2. В Postman
Эксперимент проводил на стандартном наборе CRUD операций, который в дальнейшем можно расширять.
Так как в Postman все операций выполняются только в рамках запроса, пришлось ввести пустой get запрос в конце выполнения которого определяется следующий запрос из последовательности. Выполнить JS код до запроса и определить первый запрос без пустого не получилось.
Во всех запросах Pre-request script и Test секции пустые, весь код унифицирован для запросов и хранится в общих секциях Pre-request script и Test папки API Collection.
Во всех запросах важно обратить внимание на url и на секцию Body в запросах POST и PUT, их значения определяются переменными, значения в которые вносятся из JSON с данными.
Как читать Excel. Первой не пустой строкой идет номер тест кейса, то есть тест кейс хранится вертикально и на этой странице 9 тест кейсов. В текущем наборе в каждом тест кейсе будут выполнены сначала POST запрос, потом Delete.
Как запустить генерацию Json из Excel. В Excel нажать F11 и перейти на «ЭтаКнига», там запустить макрос.
R – request, означает начало нового запроса, во второй ячейке строки хранится тип запроса, в третьей адрес, по которому надо обращаться. Обратите внимание, что в url можно указывать переменные Postman
Значение из переменной подтянется
H – Данные для сверки в заголовке, пока ввел только response code, в Postman зашита проверка только на него. Важно чтобы в Excel название было таким же «response code», либо поправить в Postman
I, I2 … – Секция входных данных, поддерживает хранение моделей данных любой вложенности, цифра справа от I отвечает за уровень вложенности. Следующий набор данных вот так завернется в JSON. Если переменная, которая хранит данные пустая, то она не добавится. То есть если в переменной inn не будет значения, то она не добавится, а переменная chief добавится, так как она хранит модель. При этом если вся модель пустая, то она также не добавится.
Данные этой секции будут поданы в теле запроса
O, O2 … — Секция выходных параметров, они будут сравнены с теми, что возвращает response. Как и секция Input поддерживает хранение моделей.
При сравнении данные конвертируются в string, еще я дополнительно ограничил уровень рекурсии, это можно убрать
PO – Postman Output, значения из этой секции будут по имени переменной браться из response body запроса и записываться в переменную Postman.
В Excel достаточно поставить любой символ, в переменную запишется значение из response, а не excel
Эта секция нужна, чтобы хранить данные между скриптами, например чтобы удалить объект с id, который был создан в предыдущем реквесте
PC – Postman command, ввел только одну команду “terminate”, она используется для принудительного обрывания после выполнения текущего запроса. Полезно при негативном тесте, чтобы не вызывать шаг с удалением созданного объекта.
Ввод этой команды позволил на одном листе хранить и позитивные и негативные тесты
PI – Postman Input, значения из этой секции будут записаны в переменные Postman перед определением url
Может быть полезным, если надо переопределить переменные, которые указаны в url запроса.
Кстати, в подаваемых данных можно использовать данные из Postman переменных, для этого требуется использовать специальную конструкцию
В кейсе 1 мы внесли полученное значение в переменную, в кейсе 2 его использовали. Можно использовать не только в следующем кейсе, но и в текущем при следующем запросе. Например может потребоваться, если определение объекта для изменения идет не по url, а по значению переменной в запросе.
А теперь прогон, запускаем Postman runner, в нем выбираем нужную коллекцию и подгружаем файл с тестовыми данными:
Подавать будем следующий набор:
Здесь описано 15 тестов, при этом шаги 1-11, 13, 15 положительные с результатом 200 при POST запросе и шаги 12, 14 негативные с результатом 400. По ним информация в базу не будет внесена и поэтому секция Output пустая, а также указана команда terminate. Эта команда прервет выполнение последовательности и запрос на удаление «Delete» отправлен не будет.
После кейсов 1-11, 13, 15 мы запоминаем id который присвоился новому объекту, чтобы потом его удалить.
Все 15 тестов прошли успешно, на картинке виден тест 14, в котором не вызывается Delete после POST
В тестах 1-11,13,15 после POST вызывается удаление созданного объекта:
Update от 15.10.2019
1. Доработал возможность генерации json файлов без запуска excel, выложил в гит GenerateAll.cmd, который запускает vb скрипт GenerateJsonFiles.vbs. Вызванный скрипт пройдет по текущей папке и всем вложенным и сгенерирует json файлы
2. RunAll.cmd запускаем для прогона всех сгенерированных json файлов с данными, также пройдет текущую папку и все вложенные папки. Рядом с каждым из них положит output-report.log с результатами прогона.
Теперь прикрутить к CI не должно быть проблемой. Также можно прикрутить генерацию json к git deploy и проводить сравнение данных в excel по изменениях в json файлах.
Первоначально на каждый API я писал свои коллекции и готовил тестовые данные в JSON формате. Это достаточно удобно, но при большом количестве тестов и коллекций поддерживать это становится накладно. Да и проводить валидацию данных в JSON не удобно.
Для решения этих проблем я написал макрос для Excel и коллекцию в Postman. Теперь в Postman у меня одна коллекция на все API и стандартный набор функций для обработки входящих данных и валидации возвращаемых результатов. Мне удалось перенести управление тестовыми данными и последовательность выполнения запросов в Excel.
Что было
1. JSON с данными
Раньше тестовый набор хранился в таком виде
2. 2. Последовательность выполнения запросов с обработчиками на JS хранилась в коллекциях Postman.
Что стало
1. Тестовый набор переехал в Excel
Все данные вносятся в Excel (управляющие ключевые символы: R, H, I и т.д. распишу ниже) и дальше при помощи макроса перегоняются в json формат:
2. В Postman
Эксперимент проводил на стандартном наборе CRUD операций, который в дальнейшем можно расширять.
Так как в Postman все операций выполняются только в рамках запроса, пришлось ввести пустой get запрос в конце выполнения которого определяется следующий запрос из последовательности. Выполнить JS код до запроса и определить первый запрос без пустого не получилось.
Во всех запросах Pre-request script и Test секции пустые, весь код унифицирован для запросов и хранится в общих секциях Pre-request script и Test папки API Collection.
Во всех запросах важно обратить внимание на url и на секцию Body в запросах POST и PUT, их значения определяются переменными, значения в которые вносятся из JSON с данными.
Теперь о самих тестах
Как читать Excel. Первой не пустой строкой идет номер тест кейса, то есть тест кейс хранится вертикально и на этой странице 9 тест кейсов. В текущем наборе в каждом тест кейсе будут выполнены сначала POST запрос, потом Delete.
Как запустить генерацию Json из Excel. В Excel нажать F11 и перейти на «ЭтаКнига», там запустить макрос.
Ключевые слова
R – request, означает начало нового запроса, во второй ячейке строки хранится тип запроса, в третьей адрес, по которому надо обращаться. Обратите внимание, что в url можно указывать переменные Postman
Значение из переменной подтянется
H – Данные для сверки в заголовке, пока ввел только response code, в Postman зашита проверка только на него. Важно чтобы в Excel название было таким же «response code», либо поправить в Postman
I, I2 … – Секция входных данных, поддерживает хранение моделей данных любой вложенности, цифра справа от I отвечает за уровень вложенности. Следующий набор данных вот так завернется в JSON. Если переменная, которая хранит данные пустая, то она не добавится. То есть если в переменной inn не будет значения, то она не добавится, а переменная chief добавится, так как она хранит модель. При этом если вся модель пустая, то она также не добавится.
Данные этой секции будут поданы в теле запроса
O, O2 … — Секция выходных параметров, они будут сравнены с теми, что возвращает response. Как и секция Input поддерживает хранение моделей.
При сравнении данные конвертируются в string, еще я дополнительно ограничил уровень рекурсии, это можно убрать
PO – Postman Output, значения из этой секции будут по имени переменной браться из response body запроса и записываться в переменную Postman.
В Excel достаточно поставить любой символ, в переменную запишется значение из response, а не excel
Эта секция нужна, чтобы хранить данные между скриптами, например чтобы удалить объект с id, который был создан в предыдущем реквесте
PC – Postman command, ввел только одну команду “terminate”, она используется для принудительного обрывания после выполнения текущего запроса. Полезно при негативном тесте, чтобы не вызывать шаг с удалением созданного объекта.
Ввод этой команды позволил на одном листе хранить и позитивные и негативные тесты
PI – Postman Input, значения из этой секции будут записаны в переменные Postman перед определением url
Может быть полезным, если надо переопределить переменные, которые указаны в url запроса.
Кстати, в подаваемых данных можно использовать данные из Postman переменных, для этого требуется использовать специальную конструкцию
В кейсе 1 мы внесли полученное значение в переменную, в кейсе 2 его использовали. Можно использовать не только в следующем кейсе, но и в текущем при следующем запросе. Например может потребоваться, если определение объекта для изменения идет не по url, а по значению переменной в запросе.
Подготовка к прогону
А теперь прогон, запускаем Postman runner, в нем выбираем нужную коллекцию и подгружаем файл с тестовыми данными:
Подавать будем следующий набор:
Здесь описано 15 тестов, при этом шаги 1-11, 13, 15 положительные с результатом 200 при POST запросе и шаги 12, 14 негативные с результатом 400. По ним информация в базу не будет внесена и поэтому секция Output пустая, а также указана команда terminate. Эта команда прервет выполнение последовательности и запрос на удаление «Delete» отправлен не будет.
После кейсов 1-11, 13, 15 мы запоминаем id который присвоился новому объекту, чтобы потом его удалить.
Запускаем
Все 15 тестов прошли успешно, на картинке виден тест 14, в котором не вызывается Delete после POST
В тестах 1-11,13,15 после POST вызывается удаление созданного объекта:
Резюме
- Последовательность выполнения запросов для тестирования API вынесена в Excel и обрабатывается в Postman.
- Все тестовые данные также вынесены в Excel ими удобно управлять и валидировать их. По крайней мере удобней чем в JSON формате.
- Коллекция Postman стандартизирована и при тестировании схожих API не требует доработки.
Ссылки
- Репозиторий на GitHub, там лежит Excel и коллекция Postman
- При разработке использовался VBA-JSON инструмент за авторством Tim Hall
Update от 15.10.2019
1. Доработал возможность генерации json файлов без запуска excel, выложил в гит GenerateAll.cmd, который запускает vb скрипт GenerateJsonFiles.vbs. Вызванный скрипт пройдет по текущей папке и всем вложенным и сгенерирует json файлы
2. RunAll.cmd запускаем для прогона всех сгенерированных json файлов с данными, также пройдет текущую папку и все вложенные папки. Рядом с каждым из них положит output-report.log с результатами прогона.
Теперь прикрутить к CI не должно быть проблемой. Также можно прикрутить генерацию json к git deploy и проводить сравнение данных в excel по изменениях в json файлах.