【问题标题】:Assert multiple values in an XML response received on querying DB in SOAP UI在 SOAP UI 中查询 DB 时收到的 XML 响应中断言多个值
【发布时间】:2017-03-08 01:20:51
【问题描述】:

我正在尝试从 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>

从上面的响应中,第一步我必须断言“TASK1”存在并且“Value1”存在于同一个集合中,然后是“TASK2”和“Value1”

如果这含糊不清,请告诉我,以便我可以尝试修改我的查询

【问题讨论】:

  • Surya,你有机会看看提供的解决方案吗?

标签: groovy soapui


【解决方案1】:

改用 Xpath 断言
断言 1
/Results/ResultSet[@fetchSize="10"]/Row[1]/T1
预期结果
任务 1
断言 2
/Results/ResultSet[@fetchSize="10"]/Row[1]/T3
预期结果
价值1

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

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

【讨论】:

  • 谢谢兄弟.. 我已经试过了。但是,由于基于我测试的场景类型的任务太多,我很难为每个任务做。因此,我包含了一个 groovy 脚本,它将捕获响应并根据值继续执行进一步的步骤。
【解决方案2】:

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

脚本断言

//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不是故意捕捉所有比较问题,不想一开始比较问题就停下来。

【讨论】:

  • 哇!!我从来不知道我们可以做这样的事情。我编写了一个冗长的 groovy 脚本来断言这些值并根据这些值继续。从外观上看,我觉得我可以将它包含到我现有的 groovy 脚本中。我会试试这个,让你知道这是否有效:)
  • @Surya,不确定您在发布问题后似乎没有检查。很高兴你回来寻找解决方案。大多数断言可以在 Script Assertion 中用于同一个 jdbc 步骤,而不是单独的 groovy 脚本(少一个测试步骤)
【解决方案3】:

试试 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'

我希望你能自己做剩下的事情;)

【讨论】:

  • 谢谢安东。我将把它包含在我的脚本中并尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2016-01-03
  • 1970-01-01
相关资源
最近更新 更多