Что делать если postman остопиздил, а надо тестировать SOAP API

Опубликовано 6 окт. 2025 г.

Автор: Масим Братковский (sillyboba)

Введение

Всем привет! Я QA, работаю в одной компании-разработчике в сфере телекома. Платформа в моем попечение реализована на Soap, это накладывает некоторые трудности в подборе тулз для тестирования.

ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМ

Для SOAP API обычно используется Postman. Инструмент логичный, но имеет свои недостатки.

  1. Один запрос = одна сущность. Одна сущность = одно xml тело.

Пока запросов немного, итс окей, если запросов 100+, это уже тяжело поддерживать. 500? 1000? Это похороны.

  1. Нет интеграции с гитом(бесплатной)

Можно экспортить коллекцию и файл env, и через гит баш загружать его в репу, но это не очень удобно.

  1. Отсутствует возможность тулинга

В постмане есть встроенное js окружение, но оно ограниченно + нет возможности вынести написанные инструменты в отдельную “сущность” и переиспользовать их в каждом тесте. Чаще всего нужно будет копипастить тулзу в каждый тест.

Итог

Инструмент есть, но его возможности ограничены и это создает трудности, но какие альтернативы? SoapUI или другие постман подобные тулзы имеют те же минусы.

Если писать автотесты на каком либо яп, затык с xml. Из коробки они не собираются, можно хранить xml в проекте и отправлять их через http, но это мало чем отличается от постмана. Вот бы собирать xml тело запроса на лету…

WSDL спешит на помощь

WSDL - xml документ, в котором описано все api взаимодействие вашей платформы. Все реквесты и респонсы, строки состояния, эксепшены, сущности и их поля. Это не все!

Из этого документа можно сформировать сущности/классы/POJOs со всем необходимым, собрать эту сущность и преобразовать(смаршалить) ее в xml документ, а благодаря встроенному soap клиенту вы сможете отправить запрос на вашу платформу. ИМБА!

Что мы получим?

  1. Возможность создавать нужные нам xml тела прямо в коде, и парсить xml респонсы.
  2. Писать всевозможные инструменты, что будут упрощать жизнь при написании тестов.
  3. Встроенный soap клиент, через который можно отправлять запросы на сервер.
  4. Можно подключать все возможные либы к проекту и вообще никаких ограничений.
  5. Максимальная совместимость с проектом, тк он использует тот же самый 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 не попадают в Аллюр…

Если вам интересно, давайте обратную связь, буду рад продолжить серию статей.

Комментарии