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.
我最近学习了如何在 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.