В этом уроке мы рассмотрим, как с помощью POJO упростить себе тестирование API. Сначала мы напишем простой автотест для проверки двух API-методов. Затем рассмотрим, что такое сериализация и десериализация. После этого модифицируем имеющийся автотест с использованием POJO, сначала при отправке данных, а затем и для проверки результата.
Что такое POJO?
POJO расшифровывает как Plain Old Java Object. Это простой объект Java, который не зависит от каких-либо специальных фреймворков или библиотек. Это класс, который не наследуется от каких-либо специальных классов и не реализует какие-либо интерфейсы, присущие фреймворкам, таким как Hibernate или Spring. POJO обычно используется для представления данных и является отличным вариантом для создания моделей, особенно в контексте тестирования и автоматизации.
Главная характеристика POJO — это простота. POJO не имеет дополнительных требований или ограничений, что делает его легким для понимания и использования. POJO не содержит бизнес-логики, а сосредоточен на хранении данных. Его можно использовать для сериализации и десериализации объектов, что полезно при взаимодействии с веб-сервисами или обмене данными.
В автоматизации тестирования POJO может использоваться для создания объектов, которые содержат данные для тестов. Например, представление структуры данных, загружаемых из базы данных или ответов API. Это позволяет удобно организовать ваши тесты и легче управлять тестовыми данными.
Автотест без POJO.
Для начала выберем API, который имеет подходящие для демонстрации методы. В нашем случае это будет уже известный многим Petstore. Посмотреть его описание можно по следующей ссылке: https://petstore3.swagger.io/#/pet
Для автотеста нам потребуется POST метод /pet. С его помощью мы будем добавлять питомца. Все данные для питомца передаются в теле запроса. Нам потребуется указать поле id, в котором содержится идентификатор питомца. Поле name, содержащее имя питомца. Поле status, которое содержит его текущий статус в магазине. В полях photoUrls и tags мы оставим пустые массивы. У нас должно получится такое тело запроса:
Попробуем отправить запрос. В результате мы должны получить от сервера ответ 200 OK. А в теле ответа должен быть такой JSON-объект:
Создание проекта и подключение зависимостей
Теперь давайте попробуем написать автотест для проверки такого запроса. Писать будем на языке Java, с использованием библиотек TestNG и Rest Assured. Для начала создадим новый проект. Для этого в верхнем меню выбираем New -> Project... Имя проекта у нас будет Api Tests Pojo. Далее укажем расположение проекта. Сборка будет через Maven. Далее выбираем 17-ю версию JDK. В дополнительных настройках укажем groupId и artifactId и нажмём кнопку Create.
Итак, проект создан, теперь необходимо добавить в зависимости нужные нам библиотеки. Для начала это будет TestNG для запуска тестов и Rest Assured для работы с API. Кстати, в своём курсе по тестированию Rest API, ссылка будет ниже, я более подробно разбираю работу с этими фреймворками при тестировании API.
Автотесты для API с Java, REST Assured и TestNG.
Курс знакомит тестировщиков ПО с часто встречающимися задачами при тестировании backend приложений. На примере простого микро сервиса вы увидите что собой представляет REST API. Какие основные подходы для тестирования ПО используются при его проверках. С помощью каких инструментов и библиотек пишутся автотесты и создаются тестовые фреймворки.
🔸 Начать обучение 🔸
Если интересно, переходите по ссылке и попробуйте бесплатный урок. Для подключения библиотек нам потребуется открыть файл pom.xml, находящийся в корне проекта.
Добавим в него следующие зависимости:
Тег <dependencies> является контейнером для всех зависимостей, которые ваш проект использует. Внутри него перечисляются все библиотеки, которые нужны для компиляции, тестирования и запуска вашего проекта. Первая зависимость подключает в проект фреймворк Rest Assured, который мы будем использовать в автотесте для взаимодействия с API. Вторая зависимость — это фреймворк TestNG. С его помощью мы будем запускать наш автотест. После добавления зависимостей не забудьте загрузить изменения, нажав на «Load Maven Changes».
Первая версия автотеста.
Теперь перейдём к написанию автотеста. Первая версия теста будет самой простой. Тестовые данные мы сохраним в строке, которую затем передадим в теле запроса. Создайте класс SampleTest в папке src/test/java и добавьте в него следующий код:
Давайте чуть подробнее рассмотрим, какие действия мы добавили в этом автотесте.
В строке petInfo сохраняем информацию о питомце. Её можно просто скопировать из запроса в Swagger UI, который мы ранее отправляли.
Здесь мы указываем базовый URL. Это базовая часть URL, к которой затем добавляется путь /pet.
Далее идёт отправка POST запроса. С помощью метода body() мы добавляем строку с данными питомца в тело запроса. Метод post("/pet") отправляет POST-запрос к нашему эндпоинту.
Потом проверяем статус код. Убеждаемся, что сервер вернул успешный ответ, статус-код которого равен 200 OK.
Этот блок содержит проверки ответа от сервера. Сначала мы проверяем идентификатор питомца в поле id, затем его имя в поле name. Они должны быть равны тем, которые мы отправляли в теле запроса. Далее идут проверки для полей photoUrls и tags. В ответе они приходят пустыми, поэтому мы сначала проверяем, что их значение не null, а затем проверяем количество элементов, которое должно быть равно нулю.
Обратите внимание на несколько моментов, которые станут критичными при увеличении количества тестов. Данные запроса в строке трудно читать. Нам тяжело будет читать и поддерживать подобные тесты, если их количество увеличится. То же самое можно сказать и о проверках ответа. Использование моделей в виде POJO для отправки данных и проверки ответов вместо строк имеет несколько важнейших преимуществ в автоматизации тестирования на Java.
Почему лучше использовать модели?
Во-первых, читаемость кода. Когда мы используем модели в POJO, код становится более структурированным и понятным. Это позволяет любому разработчику или тестировщику легче понимать, что именно отправляется и что ожидается в ответе. Строки, содержащие JSON, обычно труднее читать и поддерживать.
Во-вторых, проверка типов. Модели позволяют компилятору проверять соответствие типов данных. Таким образом, если структура ответа изменится, мы увидим ошибку на этапе компиляции, и нам будет легче обнаружить проблемы. Строки же не предоставляют такой проверки: если вы случайно пропустите поле в JSON-строке или ошибетесь с типом, это может не проявиться до выполнения кода.
В-третьих, облегчение работы с библиотеками сериализации и десериализации. С помощью таких библиотек, как Jackson или Gson, вы можете легко преобразовывать объекты моделей в JSON и обратно. Это делает код более чистым и позволяет избежать ручных манипуляций со строками, что уменьшает вероятность ошибок.
Таким образом, использование моделей делает код более понятным, безопасным и легким в поддержке, что особенно важно в контексте автоматизации тестирования.
Что такое сериализация?
Сериализация — это процесс преобразования объекта в последовательность байтов, которая может быть сохранена на диске или передана по сети. В Java этот процесс позволяет сохранять состояние объекта для дальнейшего восстановления, что особенно полезно при передаче данных между различными компонентами системы или при их хранении в файлах.
Когда объект сериализуется, значения его полей конвертируются в форматы, которые могут быть сохранены или переданы, например, в JSON или XML. После этого сериализованный объект можно десериализовать, восстановив его первоначальное состояние.
Сериализация полезна в автоматизации тестирования, например, для передачи данных при вызовах API-методов. Это дает возможность легко управлять данными и обеспечивать повторяемость тестов.
Создаём POJO для нашего теста
Нам потребуется создать новый класс. Назовём его Pet. Добавим туда следующий код:
С помощью этого класса мы хотим передавать и проверять информацию о домашнем питомце, поэтому нам потребуется указать все поля: id, name, photoUrls, tags и status, которые передаются в запросе. Ещё нам потребуется два конструктора, с помощью которых наш объект будет создаваться, а также геттеры, сеттеры для всех полей и методы equals() и hashCode(). Кстати, если вы используете Intellij IDEA, всё это можно создать, воспользовавшись сочетанием клавиш alt + insert. Далее выбираете нужный пункт, отмечаете поля и нажимаете ok.
Теперь нам необходимо создать новый объект класса Pet и с помощью конструктора инициализировать его нужными нам данными. Это будет выглядеть вот так:
Осталось заменить аргумент в методе body со строки petInfo на объект pet. Но это ещё не всё, чтобы объект правильно сериализовался, нам потребуется ещё одна библиотека. Поэтому открываем pom.xml и добавляем туда ещё одну зависимость:
Эта библиотека используется для обработки данных в формате JSON. Она предназначена для сериализации объектов Java в JSON и десериализации JSON в объекты Java. Это делает Jackson очень полезным инструментом для работы с данными в автоматизации тестирования и при разработке приложений.
Основные функции библиотеки включают сериализацию объектов Java в формат JSON. Это особенно удобно, когда вам нужно отправить данные на сервер или сохранить их в файле в формате JSON. Ещё они включают десериализацию, позволяя преобразовать JSON-данные обратно в объекты Java. Это полезно, когда вы получаете данные от API или загружаете их из файла и хотите работать с ними как с обычными объектами Java.
Jackson поддерживает сложные структуры данных, такие как списки и вложенные объекты, что делает его подходящим для работы с различными форматами данных, которые могут возникнуть в реальных приложениях.
В автоматизации тестирования Jackson может быть использован при обмене данными с внешними API, а также для обработки настроек и конфигураций в формате JSON, что помогает QA инженерам эффективно управлять тестовыми данными.
Теперь мы можем запустить автотест и убедиться в том, что логика его выполнения не поменялась и он по-прежнему проходит без ошибок.
Что такое десериализация?
Перейдём к проверке ответа. Вместо проверки ответа с помощью метода body, получим ответ от сервера и преобразуем тело ответа в объект класса Pet. Такое действие — это десериализация.
Десериализация — это процесс, обратный сериализации, который заключается в преобразовании последовательности байтов обратно в объект. Это позволяет восстановить состояние объекта, сохраненного ранее в сериализованном формате, и использовать его в автотесте.
Когда данные десериализуются, Java создает новый объект и заполняет его полями, используя значения, которые были сохранены в процессе сериализации. Например, в автоматизации тестирования десериализация может использоваться для восстановления тестовых данных из файлов, получения состояния тестового окружения или проверки ответа. Это облегчает повторное использование и управление данными между разными тестами. Это увеличивает гибкость и позволяет более эффективно организовывать автотесты.
Улучшаем проверку ответа.
Сохраним результат выполнения метода post() в объекте response. Далее с помощью метода as() десериализуем данные в объект класса Pet. С помощью метода assertEquals() мы можем сравнить новый объект с тем, который мы использовали в начале теста для добавления питомца.
Старый код, в котором мы делали проверки тела ответа, нам больше не нужен, поэтому удалим его. Если вы всё сделали верно, новый тест будет выглядеть следующим образом:
Снова запустим тест и убедимся в том, что он проходит успешно.
Использование моделей для отправки запросов и проверки ответов, упрощает отладку и тестирование. Вам будет проще настроить и посмотреть значения отдельных полей модели, чем при работе со сложными строками. Если в вашем приложении потребуется изменить структуру данных (добавить новые поля или изменить существующие), вам не придется переписывать все строки JSON. Достаточно обновить модель, и изменения автоматически отобразятся в коде, что значительно упрощает обслуживание автоматизированных тестов.