在 SOAP UI 中查询数据库时收到的 XML 响应中断言多个值
Assert multiple values in an XML response received on querying DB in SOAP UI
我正在尝试从数据库中检索一些数据,并且根据响应,我必须通过或不通过测试用例。每次查询 db
时我都必须这样做
我能够连接到数据库并获得响应。但是,不太确定如何断言响应中的值
尝试使用 Script Assertion 但无法理解,因为我对此完全陌生
<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"
如果这含糊不清,请告诉我,以便我可以尝试修改我的查询
试试 XmlSlurper:http://groovy-lang.org/processing-xml.html
检查任务 1:
def results = new XmlSlurper().parseText(response)
def row1 = results.ResultSet.find { node->
node.name() == 'Row' && node.@rowNumber == '1'
}
assert row1.T2 == 'TASK1'
我希望你能自己完成剩下的事情 ;)
您可以将 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;它显示了失败错误消息的样子。
请注意,上面的脚本中使用了列名 T2
、T3
。如果名称与原始结果不同,请在最后进行更改。
还要注意assertion
不是故意来捕捉所有的比较问题,不想停在首先比较问题。
改为使用 Xpath 断言
断言 1
/Results/ResultSet[@fetchSize="10"]/行[1]/T1
预期结果
任务 1
断言 2
/Results/ResultSet[@fetchSize="10"]/行[1]/T3
预期结果
值 1
您可以为任意数量的节点添加任意数量的 Xpath 断言。
快速提示: 要生成 XPath,请使用在线工具或 Oxygen XML 编辑器。 :)
我正在尝试从数据库中检索一些数据,并且根据响应,我必须通过或不通过测试用例。每次查询 db
时我都必须这样做我能够连接到数据库并获得响应。但是,不太确定如何断言响应中的值
尝试使用 Script Assertion 但无法理解,因为我对此完全陌生
<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"
如果这含糊不清,请告诉我,以便我可以尝试修改我的查询
试试 XmlSlurper:http://groovy-lang.org/processing-xml.html
检查任务 1:
def results = new XmlSlurper().parseText(response)
def row1 = results.ResultSet.find { node->
node.name() == 'Row' && node.@rowNumber == '1'
}
assert row1.T2 == 'TASK1'
我希望你能自己完成剩下的事情 ;)
您可以将 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;它显示了失败错误消息的样子。
请注意,上面的脚本中使用了列名 T2
、T3
。如果名称与原始结果不同,请在最后进行更改。
还要注意assertion
不是故意来捕捉所有的比较问题,不想停在首先比较问题。
改为使用 Xpath 断言
断言 1
/Results/ResultSet[@fetchSize="10"]/行[1]/T1
预期结果
任务 1
断言 2
/Results/ResultSet[@fetchSize="10"]/行[1]/T3
预期结果
值 1
您可以为任意数量的节点添加任意数量的 Xpath 断言。
快速提示: 要生成 XPath,请使用在线工具或 Oxygen XML 编辑器。 :)