Рассмотренные в статье примеры вы можете опробовать и сами, так как запросы мы будем отправлять в бесплатное приложение Users.
Возьмем метод CreateCompany. У нас есть пример вызова в ТЗ для REST-запроса. Но мы знаем, что аналогичный запрос есть и в SOAP. А как его отправить, если бы примера в доке не было?
В SOAP хорошо то, что у нас всегда есть WSDL схема, по которой Soap Ui сам генерит заглушку запроса, остается только заполнить ее. Но это работает с простыми полями, а как нам заполнить этот массив?
Как назвать элементы внутри массива? Мы можем это проверить, вызвав метод getCompany! Проверим компанию, в которой есть сотрудники, посмотрим в ответе, как выглядит массив:
Ага, названия вложенных элементов — item. Попробуем просто передать массив с такими элементами:
<company_users>
<item>test_cu_12@mail.com</item>
</company_users>
Не работает! В ответе пустой массив сотрудников
А вот если добавить в элемент company_users атрибут soapenc:arrayType="xsd:array[]", то все заработает!
Полный запрос
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wrap="http://foo.bar/wrappersoapserver" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Header/>
<soapenv:Body>
<wrap:CreateCompany>
<company_name>Тестовая компания</company_name>
<company_type>ООО</company_type>
<email_owner>manager@mail.ru</email_owner>
<company_users soapenc:arrayType="xsd:array[]">
<item>test_cu_11@mail.com</item>
<item>test_dev@mail.com</item>
<item>ivan@noibiz.com</item>
</company_users>
</wrap:CreateCompany>
</soapenv:Body>
</soapenv:Envelope>
Этот тип soapenc:arrayType="xsd:array[]" мы видим в XSD в WSDL — ищите по ArrayOfCompany_users.
В ответе метода get мы видели запись "xsd:string[2]". То есть мы указываем, массив каких элементов передаем, две строки. Можно и так:
<company_users soapenc:arrayType="xsd:string[3]">
<item>test_cu_11@mail.com</item>
<item>test_dev@mail.com</item>
<item>ivan@noibiz.com</item>
</company_users>
Но тут надо считать, сколько элементов передаем для правильного запроса... А зачем? Проще указать "xsd:array[]"!
Домашнее задание
Вызовите метод CreateUser, передав ему массив компаний и задач.
Его мы найдем в методе CreateUserWithTasks — задачи создаются в виде массива значений.
В json формате:
{
"email": "test_cu_22@mail.com",
"name": "Рестовый 22",
"tasks": [{
"title": "Первая задача",
"description": "Первая задача 11"
},
{
"title": "Вторая задача",
"description": "Вторая задача 11"
}
],
"companies": [15, 20]
}
В xml формате:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wrap="http://foo.bar/wrappersoapserver" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Header/>
<soapenv:Body>
<wrap:CreateUserWithTasks>
<email>test_soap_22@mail.com</email>
<name>SOAP name 22</name>
<tasks>
<task>
<task_title>Первая задача(soap 1)</task_title>
<task_description>Описание</task_description>
</task>
<task>
<task_title>Вторая задача(soap 1)</task_title>
<task_description>Описание</task_description>
</task>
</tasks>
<companies soapenc:arrayType="xsd:array[]">
<item>513</item>
<item>20</item>
</companies>
</wrap:CreateUserWithTasks>
</soapenv:Body>
</soapenv:Envelope>
А вот в этом случае вызов getUser не помог, потому что он возвращает таски в таком виде:
<tasks SOAP-ENC:arrayType="ns2:Map[1]" xsi:type="SOAP-ENC:Array">
<item xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">name</key>
<value xsi:type="xsd:string">Новая</value>
</item>
<item>
<key xsi:type="xsd:string">id_task</key>
<value xsi:type="xsd:int">32</value>
</item>
</item>
</tasks>
Но, если так и передать в запросе CreateUserWithTasks, получим ошибку — параметр tasks должен быть в виде массива. Увы! Метод научного тыка не всегда срабатывает. Поэтому всегда хорошо, когда в ТЗ есть примеры на сложные методы. А если примеров нет, проще попросить их у разработчика. Ведь он знает, какие запросы система отправляет или ждет. А если не знает, то быстро и легко посмотрит в коде!
См также:
Как отправить массив через form-data в Postman
Простой массив
Возьмем метод CreateCompany. У нас есть пример вызова в ТЗ для REST-запроса. Но мы знаем, что аналогичный запрос есть и в SOAP. А как его отправить, если бы примера в доке не было?
В SOAP хорошо то, что у нас всегда есть WSDL схема, по которой Soap Ui сам генерит заглушку запроса, остается только заполнить ее. Но это работает с простыми полями, а как нам заполнить этот массив?
Заглушка запроса — как заполнить массив? |
Как назвать элементы внутри массива? Мы можем это проверить, вызвав метод getCompany! Проверим компанию, в которой есть сотрудники, посмотрим в ответе, как выглядит массив:
Ага, названия вложенных элементов — item. Попробуем просто передать массив с такими элементами:
<company_users>
<item>test_cu_12@mail.com</item>
</company_users>
Не работает! В ответе пустой массив сотрудников
Так не работает :( |
А вот если добавить в элемент company_users атрибут soapenc:arrayType="xsd:array[]", то все заработает!
А если указать у массива атрибут soapenc:arrayType — работает! |
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wrap="http://foo.bar/wrappersoapserver" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Header/>
<soapenv:Body>
<wrap:CreateCompany>
<company_name>Тестовая компания</company_name>
<company_type>ООО</company_type>
<email_owner>manager@mail.ru</email_owner>
<company_users soapenc:arrayType="xsd:array[]">
<item>test_cu_11@mail.com</item>
<item>test_dev@mail.com</item>
<item>ivan@noibiz.com</item>
</company_users>
</wrap:CreateCompany>
</soapenv:Body>
</soapenv:Envelope>
Этот тип soapenc:arrayType="xsd:array[]" мы видим в XSD в WSDL — ищите по ArrayOfCompany_users.
В ответе метода get мы видели запись "xsd:string[2]". То есть мы указываем, массив каких элементов передаем, две строки. Можно и так:
<company_users soapenc:arrayType="xsd:string[3]">
<item>test_cu_11@mail.com</item>
<item>test_dev@mail.com</item>
<item>ivan@noibiz.com</item>
</company_users>
Но тут надо считать, сколько элементов передаем для правильного запроса... А зачем? Проще указать "xsd:array[]"!
Домашнее задание
Вызовите метод CreateUser, передав ему массив компаний и задач.
Сложный массив
Его мы найдем в методе CreateUserWithTasks — задачи создаются в виде массива значений.
В json формате:
{
"email": "test_cu_22@mail.com",
"name": "Рестовый 22",
"tasks": [{
"title": "Первая задача",
"description": "Первая задача 11"
},
{
"title": "Вторая задача",
"description": "Вторая задача 11"
}
],
"companies": [15, 20]
}
В xml формате:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wrap="http://foo.bar/wrappersoapserver" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Header/>
<soapenv:Body>
<wrap:CreateUserWithTasks>
<email>test_soap_22@mail.com</email>
<name>SOAP name 22</name>
<tasks>
<task>
<task_title>Первая задача(soap 1)</task_title>
<task_description>Описание</task_description>
</task>
<task>
<task_title>Вторая задача(soap 1)</task_title>
<task_description>Описание</task_description>
</task>
</tasks>
<companies soapenc:arrayType="xsd:array[]">
<item>513</item>
<item>20</item>
</companies>
</wrap:CreateUserWithTasks>
</soapenv:Body>
</soapenv:Envelope>
А вот в этом случае вызов getUser не помог, потому что он возвращает таски в таком виде:
<tasks SOAP-ENC:arrayType="ns2:Map[1]" xsi:type="SOAP-ENC:Array">
<item xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">name</key>
<value xsi:type="xsd:string">Новая</value>
</item>
<item>
<key xsi:type="xsd:string">id_task</key>
<value xsi:type="xsd:int">32</value>
</item>
</item>
</tasks>
Но, если так и передать в запросе CreateUserWithTasks, получим ошибку — параметр tasks должен быть в виде массива. Увы! Метод научного тыка не всегда срабатывает. Поэтому всегда хорошо, когда в ТЗ есть примеры на сложные методы. А если примеров нет, проще попросить их у разработчика. Ведь он знает, какие запросы система отправляет или ждет. А если не знает, то быстро и легко посмотрит в коде!
См также:
Как отправить массив через form-data в Postman
PS — статья написана в помощь студентам моего курса «Тестирование REST API» (там мы тыкаем SOAP просто для сравнения)
PPS — сохранила статью на Testbase в навыке тестирования SOAP API. Теперь не потеряется!
PPS — сохранила статью на Testbase в навыке тестирования SOAP API. Теперь не потеряется!
Комментариев нет:
Отправить комментарий