SOAPUI - 如何将一个请求中的多个响应一次一个地传递给另一个请求

时间:2017-08-23 13:25:57

标签: soapui

我对SOAPUI和自动化测试比较陌生:

我基本上试图从一个SOAPUI响应中获取结果并将它们解析为另一个,单独这很简单,但我在第一个请求中有多个响应,需要将它们逐个解析并运行到第二个请求中。

来自请求一的回复:

 <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"      xmlns:a="http://www.w3.org/2005/08/addressing">
   <s:Header>
      <a:Action s:mustUnderstand="1">http://tempuri.org/IWebServices/GetListOfChangedCommunicationsResponse</a:Action>
   </s:Header>
   <s:Body>
      <GetListOfChangedCommunicationsResponse xmlns="http://tempuri.org/">
         <GetListOfChangedCommunicationsResult xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <b:long>8888633</b:long>
            <b:long>8888635</b:long>
            <b:long>8888637</b:long>
            <b:long>8888641</b:long>
         </GetListOfChangedCommunicationsResult>
         <CommunicationsIssue xmlns:b="http://schemas.datacontract.org/2004/07/International.CD.Entity" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <b:DigiCommErrors i:nil="true"/>
            <b:Errors/>
            <b:Warnings i:nil="true"/>
         </CommunicationsIssue>
      </GetListOfChangedCommunicationsResponse>
   </s:Body>
</s:Envelope>



I need to take those 4 responses <b:long> and pass them into this 2nd method 1 at a time replacing <tem:ReferenceNumber> each time as this method only allows individual requests

请求二:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
   <soap:Header/>
   <soap:Body>
      <tem:GetCommunicationItem>
         <!--Optional:-->
         <tem:ReferenceNumber>${#TestCase#REF_ID}</tem:ReferenceNumber>
         <!--Optional:-->
         <!--tem:BarCode>?</tem:BarCode-->
      </tem:GetCommunicationItem>
   </soap:Body>
</soap:Envelope>

在SOAPUI中完成此任务的最佳流程是什么?

2 个答案:

答案 0 :(得分:0)

假设SoapUI测试用例有两个步骤。

说:

  • 第1步:此响应有多个值,每个值运行 Step2
  • Step2 :请求需要先前响应中的值

这是方法:

  • 停用 Step2
  • <circle [attr.cx]="cx" [attr.cy]="cy" r="25" fill="yellow"></circle> 更改为<tem:ReferenceNumber>204237800</tem:ReferenceNumber>。因此,每当运行step2时,它从测试用例级别自定义属性获取值,并且在执行Step2之前,用户将此值存储在Script Assertion中。
  • <tem:ReferenceNumber>${#TestCase#REF_ID}</tem:ReferenceNumber>添加到 Step1
  • 脚本需要读取响应,解析它,提取值Script Assertion元素。
  • 对于每个long元素值,请将其设置为测试用例级自定义属性,例如long,然后从此脚本本身执行 Step2
  • REF_ID完成时, Step2 会多次执行 Step1 的响应值。因此,无需再次执行 Step2 ,因此请求在开始时禁用。

以下是Step1的脚本断言:

Script Assertion

答案 1 :(得分:0)

通过将线分成单独的部分来尝试调试出错的地方来管理它的工作:

def ids = new XmlSlurper().parseText(context.response).​'**'.findAll{it.name() == 'long'}*.text

以下是我目前使用的基于@Rau答案的脚本。不仅仅是因为我的改变必然是最好的方式,但它对我有用

def nextStep = 'CommItem'
assert context.response, 'Response is null or empty'
def content = context.expand('${ChangedComms#Response}')
def xml = new XmlSlurper().parseText(content)
def ids =xml.depthFirst().findAll{it.name() == 'long'}*.text()
ids.each {
    log.info ids
    }
assert ids, 'Did not get any values from this response'

def stepToRun = context.testCase.testSteps[nextStep]
ids.each { id ->
    log.info "Running $nextStep step for value $id"
    context.testCase.setPropertyValue('REF_ID', id.toString())
    def runner = stepToRun.run(context.testRunner, context)
    }