Что делать если postman остопиздил, а надо тестировать SOAP API
Автор: Масим Братковский (sillyboba)
Введение
Всем привет! Я QA, работаю в одной компании-разработчике в сфере телекома. Платформа в моем попечение реализована на Soap, это накладывает некоторые трудности в подборе тулз для тестирования.
ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМДля SOAP API обычно используется Postman. Инструмент логичный, но имеет свои недостатки.
- Один запрос = одна сущность. Одна сущность = одно xml тело.
Пока запросов немного, итс окей, если запросов 100+, это уже тяжело поддерживать. 500? 1000? Это похороны.
- Нет интеграции с гитом(бесплатной)
Можно экспортить коллекцию и файл env, и через гит баш загружать его в репу, но это не очень удобно.
- Отсутствует возможность тулинга
В постмане есть встроенное js окружение, но оно ограниченно + нет возможности вынести написанные инструменты в отдельную “сущность” и переиспользовать их в каждом тесте. Чаще всего нужно будет копипастить тулзу в каждый тест.
Итог
Инструмент есть, но его возможности ограничены и это создает трудности, но какие альтернативы? SoapUI или другие постман подобные тулзы имеют те же минусы.
Если писать автотесты на каком либо яп, затык с xml. Из коробки они не собираются, можно хранить xml в проекте и отправлять их через http, но это мало чем отличается от постмана. Вот бы собирать xml тело запроса на лету…
WSDL спешит на помощь
WSDL - xml документ, в котором описано все api взаимодействие вашей платформы. Все реквесты и респонсы, строки состояния, эксепшены, сущности и их поля. Это не все!
Из этого документа можно сформировать сущности/классы/POJOs со всем необходимым, собрать эту сущность и преобразовать(смаршалить) ее в xml документ, а благодаря встроенному soap клиенту вы сможете отправить запрос на вашу платформу. ИМБА!
Что мы получим?
- Возможность создавать нужные нам xml тела прямо в коде, и парсить xml респонсы.
- Писать всевозможные инструменты, что будут упрощать жизнь при написании тестов.
- Встроенный soap клиент, через который можно отправлять запросы на сервер.
- Можно подключать все возможные либы к проекту и вообще никаких ограничений.
- Максимальная совместимость с проектом, тк он использует тот же самый wsdl.
Из минусов - надо немножко покумекать, но я постораюсь облегчить этот путь.
Инструкции
Где достать WSDL?
Можно так:
curl --output file.wsdl --url 'http://{адресс вашей платформы}/sdp/ws?wsdl'
Да, обычно это просто так вот лежит, на виду. Если не лежит, то все вопросы вашему разработчику.
Что с этим делать?
- Для python есть либка zeep ссылка.
- Для go есть либка wsdl2go ссылка.
- Для java либа cxf, а именно плагин wsdl2java
Для остальных языков гуглите. Основной посыл тут - есть много инструментов для работы с wsdl.
Реализация
Вводная часть закончилась. Я попросил ИИ сгенерировать WSDL и спарсил его в небольшой пет для примера. Найти его можно тут - ссылка, а WSDL тут - ссылка. Все примеры для статьи я беру оттуда.
В целом, чтобы получить POJOs из WSDL, можно скачать плагин отсюда и с помощью терминала и не хитрой команды:
./apache-cxf-4.1.2/bin/wsdl2java -d {адресс дир куда грузить} 'http://{адресс вашей платформы}/sdp/ws?wsdl'
Получить все что нужно:
Чтобы понять откуда ноги растут и почему банк, смотри сюда - ссылка
Далее можно положить этот код в проект, и, к примеру, сделать такой объект:
TransferRequest request = new TransferRequest();
request.setAmount(new BigDecimal(10));
request.setCurrency(Currency.USD);
request.setDescription("Example Description");
request.setFromAccount("100-1");
request.setToAccount("100-2");
А потом смаршалить его в такой хмл:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:transferRequest xmlns:ns2="http://bank.example.com/">
<fromAccount>100-1</fromAccount>
<toAccount>100-2</toAccount>
<amount>10</amount>
<currency>USD</currency>
<description>Example Description</description>
</ns2:transferRequest>
ВАЖНО!!! Поля <Soap:Envelope>
и <Soap:Body>
добавляются при отправке. Это на стороне WSDL
Хоть такой подход совсем нетрудозатратен, у него есть свои минусы. WSDL во временем может устаревать плюс сеттеры не всегда удобны в использовании. С помощью следующего (мавен)плагинчика можно решить эти проблемы:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${apache.cxf.version}</version>
<executions>
<execution>
<id>generate-sources-from-wsdl</id>
<phase>generate-test-sources</phase>
<configuration>
<sourceRoot>${project.dir}</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdlLocation>wsdl_location</wsdlLocation>
<extraargs>
<extraarg>-client</extraarg>
<extraarg>-verbose</extraarg>
<extraarg>-xjc-Xfluent-api</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
<dependencies>
...
</dependencies>
</plugin>
Этот плагин возьмет WSDL из указанного место и сформирует POJOs с fluent сеттерами. Это будет срабатывать при каждом запуске проекта. Иначе говоря при каждом запуске проекта POJOs будут обновляться. Более точная реализация плагина тут - ссылка
Код с флюент сеттерами будет выглядеть уже так:
TransferRequest request = new TransferRequest()
.withAmount(new BigDecimal(10))
.withCurrency(Currency.USD)
.withDescription("Example Description")
.withFromAccount("100-1")
.withToAccount("100-2");
Клиент
Порт, через который можно будет отправлять запросы на ваш стенд тоже лежит в WSDL. Примерно, он должен выглядеть как тут - ссылка. Для более точной реализации рекомендую обратиться к вашему разработчику.
Далее запрос делается очень просто. Например, так: port.transfer(request);
З.Ы В проекте клиент не сработает, тк сервер с этим WSDL никто не разворачивал :)
Послесловие
Если данный материал был кому-то интересен, далее можно будет развернуть WSDL сервер и покидать запросики, посмотреть ответы, эксепшены и прочие штуки.
Так же всю эту богодельню нужно подключить в Аллюр отчеты, ибо, сюрприз-сюрприз, запросы через WSDL не попадают в Аллюр…
Если вам интересно, давайте обратную связь, буду рад продолжить серию статей.