DataSink 步骤 return 每个响应都包含 children

DataSink step to return each response with all the children

我最近学习了如何在 Ready API 中使用 data-driven 测试和基于数据的循环调用。我的目标是 运行 循环中的步骤,最后创建一个带有 DataSink 的 auto-export 工具,以便自动导出结果。

现在,当我尝试转到 DataSink 时,据我所知,我需要创建列 headers,如下所示

存储对应的child值

如果每个 siteId 的 soap 响应具有相同的 XML 结构,它会很好地工作。但在我的例子中,我得到的每一个 2000+ 响应都有不同数量的 children

 <retrun> </return>

例如请看一下回复1和回复2。这两个回复的children数不同。

回复 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>

现在,我需要进一步创建 table 使用整个响应以用于商业智能。如果我必须在 DataSink 中创建匹配的 header,我需要检查每一个响应以确保我在 DataSink 中创建了相应的 属性。在不影响准确性的情况下,人力是不可能的。

有没有什么方法可以对 Ready API 进行编程,以通过我指定的文件(2000+ XML 响应)中的每个循环调用存储单个 XML 响应或存储所有响应节点的 children 值,无​​需我在 DataSink window 中指定所有 header 名称。如果发生这种情况,在这两种情况下我都可以利用 BI 工具从那里创建相应的 table。

提前致谢。

正如您所指出的,children 的不同数量使线性数据接收器存在问题。

也就是说,您仍然可以使用 datasink 一次性转储所有值。在数据接收器中,创建一个 header 并使用 'get data' 到 select 响应的根节点。

这显然会生成一个巨大的文件,所以你在这里有两个选择。将所有内容转储到一个文件中,或者您可以为每个响应创建一个新文件

如果您对大量小文件的命名感到疑惑,您可以即时生成一个文件名供数据接收器使用。为此,在循环内创建一个 groovy 脚本。在此脚本中,将其设为 return 路径和文件名。您可以使用一些时间戳值,例如c:\temp\myResults20120218150102.txt,即年、月、数据、小时、分秒和毫秒。然后,在浏览文件名的数据接收器步骤中,使用获取数据 'grab' groovy 脚本的结果。

@Chris Adams 感谢您的好主意。尽管我不能完全付诸实践。但是因为你的想法(获取数据)我走了一条不同的路,我得到了我想要的。

这就是我所做的。我没有使用 DataSink,而是使用了创建文件。这个想法是每当我安排这个任务时,Ready API 可以 运行 循环整个事情并将结果放在静态文件夹中

带文件名

包含

从 Get Data Raw 请求 agr3 获得的网站 ID

${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.