【问题标题】:SOAPUI picking up values from JDBC response into an array for assertSOAPUI 将 JDBC 响应中的值提取到数组中以进行断言
【发布时间】:2017-09-28 07:17:39
【问题描述】:

我在这方面花了几个小时,在阅读了一些文章后,我不确定我是否采取了正确的方法。更多关于这个问题的最后。

在我的previous post 中发现我不应该使用数组。我的最新问题与此相反,因为我想将我的 jdbc 响应中的数据抓取到一个数组中,以针对也在数组中的 SOAP 响应进行断言。

我的 SOAP 响应以数组形式的实际(已编辑)结果工作正常,但 JDBC 响应仅获取第一个值,因此断言失败。

这是我的 JDBC 响应中的一个片段:

<Results>
    <ResultSet fetchSize="64">
        <Row rowNumber="1">
            <TW070_VALIDATION.CODE>APP</TW070_VALIDATION.CODE>
            <TW070_VALIDATION.VALID_DATA/>
        </Row>
        <Row rowNumber="2">
            <TW070_VALIDATION.CODE>CHI</TW070_VALIDATION.CODE>
            <TW070_VALIDATION.VALID_DATA>1</TW070_VALIDATION.VALID_DATA>
        </Row>
        <Row rowNumber="3">
            <TW070_VALIDATION.CODE>DEN</TW070_VALIDATION.CODE>
            <TW070_VALIDATION.VALID_DATA>1</TW070_VALIDATION.VALID_DATA>
        </Row>
   </ResultSet>
</Results>

我想为返回的每一行获取这两个值。因此,在此示例中,我希望获取以下内容以用于我的预期结果:

APP= ,CHI=1,DEN=1

我的断言脚本目前如下所示:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder( messageExchange.responseContent )
def pxml = new XmlSlurper().parseText(context.response)

//grab the expected result from jdbc response
def expectedCodes = context.expand( '${JDBC Request for expected results#ResponseAsXml#//*:TW070_VALIDATION.CODE}' ) 

//grab the actual result from the SOAP response
def actualCodes = pxml.'**'.findAll{it.name() == 'ReportAssessment'}.collectEntries{[(it.ReportAssessmentGroup.text()):it.Ranking.text()]}

log.info expectedCodes
log.info actualCodes

assert expectedCodes == actualCodes

编辑:添加我的测试结构的图片。

EDIT2:从我的 SOAP 响应中添加一个示例(第 4 步)

             <ns2:ReportAssessment>
                <ns2:ReportAssessmentGroup>APP</ns2:ReportAssessmentGroup>
                <ns2:Ranking>0</ns2:Ranking>
                <ns2:ReportAssessmentGroupDescription>APPLIANCES</ns2:ReportAssessmentGroupDescription>
             </ns2:ReportAssessment>
             <ns2:ReportAssessment>
                <ns2:ReportAssessmentGroup>CHI</ns2:ReportAssessmentGroup>
                <ns2:Ranking>1</ns2:Ranking>
                <ns2:ReportAssessmentGroupDescription>CHIROPRACTIC</ns2:ReportAssessmentGroupDescription>
             </ns2:ReportAssessment>
             <ns2:ReportAssessment>
                <ns2:ReportAssessmentGroup>DEN</ns2:ReportAssessmentGroup>
                <ns2:Ranking>1</ns2:Ranking>
                <ns2:ReportAssessmentGroupDescription>DENTAL</ns2:ReportAssessmentGroupDescription>

我一直在阅读有关循环方法的文章,因此不确定是否可以在 groovy 脚本中解决这个问题,或者我是否需要不同的测试结构来包含循环。

【问题讨论】:

  • Matt,你可以看看下面的解决方案。

标签: xml soap groovy soapui


【解决方案1】:

给你:

看来,您有一个问题,因为元素名称有.。因此,它需要用引号括起来,如下所示:

首先找到所有Rows 并从每一行创建地图。

这里是Script Assertion

//Define the expected map (key value pairs)
def expected = [APP: '', CHI: '1', DEN: '1']

//Read the xml and create map
def xml = new XmlSlurper().parseText(context.response)
def actual = xml.'**'.findAll{it.name() == 'Row'}.collectEntries{ [(it.'TW070_VALIDATION.CODE'.text()): it.'TW070_VALIDATION.VALID_DATA'.text() ]}
log.info actual
assert expected == actual

编辑:基于 OP cmets 和聊天

def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder( messageExchange.responseContent )
def pxml = new XmlSlurper().parseText(context.response)

//grab the expected result from jdbc response
def jdbcResponse = context.expand( '${JDBC Request for expected results#ResponseAsXml}')
def xml = new XmlSlurper().parseText(jdbcResponse)
def expectedCodes = xml.'**'.findAll{it.name() == 'Row'}.collectEntries{ [(it.'TW070_VALIDATION.CODE'.text()):it.'TW070_VALIDATION.VALID_DATA'.text() ]}

//grab the actual result from the SOAP response
def actualCodes = pxml.'**'.findAll{it.name() == 'ReportAssessment'}.collectEntries{[(it.ReportAssessmentGroup.text()):it.Ranking.text()]}

log.info expectedCodes
log.info actualCodes

assert expectedCodes == actualCodes

您可以快速在线尝试demo

【讨论】:

  • 谢谢饶。我可能没有正确解释这一点。我不想在这里将任何预期结果硬编码到我的断言中。我希望从 JDBC 响应中获取预期结果。
  • 抱歉还是不清楚。如果您在上面看到,则仅从 jdbc 响应中获取值并将它们称为实际值。不是吗?
  • 断言脚本在 SOAP 请求步骤上。此断言的预期结果将从上一步中的 JDBC 响应中获取。实际结果取自 SOAP 响应。
  • 你来了。您想根据请求构建预期结果。对?然后你需要显示请求
  • 我粘贴了一张图片来展示测试结构。上面原始帖子中的断言脚本附加到最后一步 - SOAP 请求。断言需要从步骤“JDBC 请求预期结果”的响应中获取预期结果。此响应已粘贴在原始帖子的上方。实际结果将来自断言附加到的 SOAP 请求步骤的响应。
猜你喜欢
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多