четверг, 21 марта 2019 г.

Как отправить массив через Soap Ui

Рассмотренные в статье примеры вы можете опробовать и сами, так как запросы мы будем отправлять в бесплатное приложение 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[]", то все заработает!

А если указать у массива атрибут 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. Теперь не потеряется!

Комментариев нет:

Отправить комментарий