在SOAP UI中查询DB时收到的XML响应中的多个值

时间:2017-03-08 01:20:52

标签: groovy soapui

我正在尝试从db检索一些数据,并根据响应,我必须通过或未通过测试用例。每次查询db

时我都要这样做

我能够建立与db的连接并获得响应。但是,不太确定如何从响应中断言值

尝试使用脚本断言,但无法弄明白,因为我是全新的

<Results>
<ResultSet fetchSize="10">
    <Row rowNumber="1">
        <T1>TEXT1</T1>
        <T2>TASK1</T2>
        <T3>Value1</T3>
        <T4>xyz</T4>
      </Row>
       <Row rowNumber="2">
        <T1>TEXT2</T1>
        <T2>TASK2</T2>
        <T3>Value1</T3>
        <T4>ABC</T4>
      </Row>
     </ResultSet>

从上面的回答来看,在第一步我将要断言&#34; TASK1&#34;存在和&#34; Value1&#34;存在于同一组中,然后是&#34; TASK2&#34;和&#34; Value1&#34;

如果这是模糊的,请告诉我,以便我可以尝试修改我的查询

3 个答案:

答案 0 :(得分:1)

使用Xpath断言
断言1
/结果/结果集[@ FETCHSIZE = “10”] /列[1] / T1
预期结果
任务1
断言2
/结果/结果集[@ FETCHSIZE = “10”] /列[1] / T3
预期结果
值1

您可以根据需要为任意数量的节点添加任意数量的Xpath断言。

快速提示:要生成XPath,请使用在线工具或Oxygen XML Editor。 :)

答案 1 :(得分:0)

尝试XmlSlurper:http://groovy-lang.org/processing-xml.html

检查TASK1:

def results = new XmlSlurper().parseText(response)

def row1 = results.ResultSet.find { node->
    node.name() == 'Row' && node.@rowNumber == '1'
}

assert row1.T2 == 'TASK1'

我希望你能够自己做其余的事情;)

答案 2 :(得分:0)

您可以将Script Assertion用于soapUI中的JDBC Request测试步骤。

脚本断言

//define your expected data as map. You may add more key value pairs if more Rows
def expectedData = ['TASK1':'Value1', 'TASK2':'Value1']

//Assert if the response is not null
assert context.response, 'Response is not null or empty'

//Parse and get rows
def rows = new XmlSlurper().parseText(context.esponse).ResultSet.Row

def getRowData = { data, elementName, elementValue ->
    data.'**'.findAll { it.name() == elementName && it == elementValue }*.parent()
}

def assertionErrors = new StringBuffer()

//Loop thur expectedData and capture the errors
expectedData.each { key, value->
    def matchingRow = getRowData(rows, 'T2', key)[0]
    value == matchingRow.T3.text() ?: assertionErrors.append("Assertion failed for rowNumber ${matchingRow.@rowNumber}\n")
}

//Check and show the result
if (assertionErrors) {
    throw new Error(assertionErrors.toString())
} else {
    log.info 'Assertions passed'
}

您可以在线快速尝试解决方案 Demo ;它显示了失败错误消息的样子。

请注意,上面的脚本中使用了列名T2T3。如果原始结果中的名称不同,只需在最后进行更改。

另请注意,assertion未使用故意 来捕获所有比较问题,不想在第一次比较问题时停止。