Шаг ссылки на данные для возврата каждого ответа со всеми дочерними элементами

#web-services #soap #soapui #ready-api

#веб-службы #мыло #soapui #готовый api

Вопрос:

Совсем недавно я узнал, как использовать тестирование на основе данных в готовом API и циклические вызовы на основе данных. Моя цель — выполнить шаги в цикле и в конце создать средство автоматического экспорта с помощью DataSink, чтобы результаты автоматически экспортировались.

Тестовые шаги

Теперь, когда я пытаюсь перейти к DataSink, как я понял, мне нужно создать заголовки столбцов, как показано ниже

Ссылка на данные

для сохранения соответствующих дочерних значений

Сопоставление

Это будет хорошо работать, если ответ soap для каждого из идентификаторов сайта имеет одинаковую структуру XML. Но в моем случае каждый из 2000 ответов, которые я получаю, имеет разное количество дочерних элементов внутри

  <retrun> </return>
 

Например, пожалуйста, взгляните на ответ 1 и ответ 2. Оба этих ответа имеют разное количество дочерних элементов.

Ответ 1

 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getSiteInfoResponse xmlns:ns2="http://billing.xyz.cc/">
         <return>
            <address1>A</address1>
            <city>B</city>
            <closeDate>2018-10-15T00:00:00-05:00</closeDate>
            <contact1/>
            <contact2>TBD</contact2>
            <country>X1</country>
            <customerNbr>288</customerNbr>
            <emailAddr1/>
            <emailAddr2/>
            <fax1>0</fax1>
            <fax2>0</fax2>
            <gps>C</gps>
            <grouping2>Leased</grouping2>
            <grouping4>D</grouping4>
            <jobTitle1/>
            <jobTitle2/>
            <phone1>0</phone1>
            <phone2>0</phone2>
            <siteId>862578</siteId>
            <siteName>D</siteName>
            <squareFoot>0.0</squareFoot>
            <state>E</state>
            <weatherStation>D</weatherStation>
            <zip4>4</zip4>
            <zip5>F</zip5>
        </return>
  </ns2:getSiteInfoResponse>
   </soap:Body>
</soap:Envelope>
 

Ответ 2

 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getSiteInfoResponse xmlns:ns2="http://billing.xyz.cc/">
         <return>
            <address1>1202</address1>
            <city>QA</city>
            <contact1/>
            <contact2>BL</contact2>
            <country>A</country>
            <customerNbr>288</customerNbr>
            <emailAddr1/>
        <emailAddr2/>
        <fax1>0</fax1>
        <fax2>0</fax2>
        <gps>LTE</gps>
        <grouping1>1345</grouping1>
        <grouping2>Leased</grouping2>
        <grouping3>ZX</grouping3>
        <grouping4>AA</grouping4>
        <grouping5>2000</grouping5>
        <jobTitle1/>
        <jobTitle2/>
        <phone1>0</phone1>
        <phone2>0</phone2>
        <services>
           <accountNbr>11099942</accountNbr>
           <liveDt>2013-07-01T00:00:00-05:00</liveDt>
           <service>2</service>
           <serviceType>gas</serviceType>
           <vendorAddr1/>
           <vendorAddr2>M</vendorAddr2>
           <vendorCity>N</vendorCity>
           <vendorName>O</vendorName>
           <vendorNbr>P</vendorNbr>
           <vendorPhone>Q</vendorPhone>
           <vendorState>R</vendorState>
           <vendorZip>S</vendorZip>
        </services>
        <services>
           <accountNbr>13064944</accountNbr>
           <liveDt>2018-05-20T00:00:00-05:00</liveDt>
           <service>2</service>
           <serviceType>gas</serviceType>
           <vendorAddr1/>
           <vendorAddr2>A</vendorAddr2>
           <vendorCity>B</vendorCity>
           <vendorName>C</vendorName>
           <vendorNbr>677</vendorNbr>
           <vendorPhone>D</vendorPhone>
           <vendorState>E</vendorState>
           <vendorZip>F</vendorZip>
        </services>      
        <siteId>101567</siteId>
        <siteName>X</siteName>
        <squareFoot>4226.0</squareFoot>
        <state>Y</state>
        <weatherStation>Z</weatherStation>
        <zip4>0</zip4>
        <zip5>L</zip5>
     </return>
  </ns2:getSiteInfoResponse>
   </soap:Body>
</soap:Envelope>
 

Теперь мне нужно дополнительно создать таблицу, используя весь ответ, который будет использоваться в бизнес-аналитике. Если мне нужно создать соответствующие заголовки в DataSink, мне нужно просмотреть все ответы, чтобы убедиться, что я создал соответствующее свойство в datasink. Это невозможно без ущерба для точности.

Есть ли какой-либо способ запрограммировать готовый API для хранения отдельного XML-ответа при каждом циклическом вызове в указанном мной файле (более 2000 XML-ответов) или для сохранения всех значений дочерними элементами узла ответа без необходимости указывать все имена заголовков в окне DataSink. Если это произойдет, я буду в порядке в обоих случаях, чтобы использовать инструмент BI для создания соответствующей таблицы оттуда.

Возврат узла

Заранее благодарю вас.

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

1. Чтобы сохранить отдельные ответы, вы можете запустить testsuite из командной строки с testrunner.bat -a ... помощью См. Официальные документы для получения дополнительной информации.

Ответ №1:

Как вы указываете, различное количество дочерних элементов делает линейный приемник данных проблематичным.

Тем не менее, вы все равно можете использовать datasink для вывода всех значений за один раз. В ссылке на данные создайте один заголовок и используйте «получить данные», чтобы выбрать корневой узел вашего ответа.

Очевидно, что это приведет к созданию большого файла, так что здесь у вас есть два варианта. Либо сбросьте все в один файл, либо вы можете создать новый файл для каждого ответа

Если вам интересно присвоить имена множеству маленьких файлов, вы можете сгенерировать имя файла на лету для использования приемником данных. Чтобы сделать это, создайте сценарий groovy внутри цикла. В этом скрипте сделайте так, чтобы он возвращал путь и имя файла. Вы могли бы использовать некоторое значение временной метки, например c:tempmyResults2020120218150102.txt , который является годом, месяцем, данными, часом, минимальными секундами и мс. Затем, на шаге приемника данных, где вы просматриваете имя файла, используйте get data, чтобы «захватить» результат скрипта groovy.

Ответ №2:

@Chris Adams спасибо за вашу потрясающую идею. Хотя я не мог полностью реализовать это на практике. Но из-за вашей идеи (получение данных) Я выбрал другой маршрут и получил то, что хотел.

Итак, это то, что я сделал. Вместо использования DataSink я использовал create file. Идея заключается в том, что всякий раз, когда я планирую эту задачу, готовый API может запускать все это в цикле и выбрасывать результат в статическую папку

с именем файла

содержащий

идентификатор сайта, полученный из запроса Get Data Raw agr3

${getSiteInfo#RawRequest#declare namespace bil='http://billing.xyz.cc/'; //bil:getSiteInfo[1]/arg3[1]}.xml

Имя файла

и

содержимое файла

с полным ответом от ответа корневого узла

 ${getSiteInfo#Response#declare namespace soap='http://schemas.xmlsoap.org/soap/envelope/'; //soap:Envelope[1]}
 

Содержимое файла

Конечный результат таков

Весь ответ

Тем не менее, я все еще заинтересован в этом, и я мог бы заставить эту часть работать.

 That said, you can still use datasink to dump out all values in one go. In the datasink, create a single header and use 'get data' to select the root node of your response.
 

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

1. Я рад, что эта идея помогла вам добиться некоторого прогресса. Удачи!