[英]Dynamically compare Rest XML/JSON response and JDBC using groovy array in SoapUI
在 SoapUI 中,我有一個 JDBC 測試步驟,它返回以下數據:
<Results>
<ResultSet fetchSize="128">
<Row rowNumber="1">
<ID>1</ID>
<NAME>TestName1</NAME>
<DESCRIPTION/>
<TYPE>Bool</TYPE>
<ISPRODUCTTAG>true</ISPRODUCTTAG>
<ISLOCATIONTAG>false</ISLOCATIONTAG>
<SUBSECTION>Default Sub Section</SUBSECTION>
<SECTION>Default Section</SECTION>
<SUBGROUP>Default Sub Group</SUBGROUP>
<GROUP>Default Group</GROUP>
</Row>
<Row rowNumber="2">
<ID>2</ID>
<NAME>TestName2</NAME>
<DESCRIPTION/>
<TYPE>Bool</TYPE>
<ISPRODUCTTAG>true</ISPRODUCTTAG>
<ISLOCATIONTAG>false</ISLOCATIONTAG>
<SUBSECTION>Default Sub Section</SUBSECTION>
<SECTION>Default Section</SECTION>
<SUBGROUP>Default Sub Group</SUBGROUP>
<GROUP>Default Group</GROUP>
</Row>
</Row>
</ResultSet>
我有一個包含以下數據的 REST API XML 響應:
<ArrayOfTagInfo>
<TagInfo id="1" name="TestName1" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
<TagInfo id="2" name="TestName2" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
</ArrayOfTagInfo>
如果可能,我希望能夠使用 groovy 數組比較(斷言)數據庫值和響應值(響應可以是 XML 或 JSON,具體取決於請求接受標頭),因為從數據庫返回的數據可能非常大.
任何人都可以幫忙嗎?
如果你有 SoapUI-Pro,你應該能夠在沒有 Groovy 的情況下完成所有這些工作。
您可以使用以下測試步驟設計測試用例:
groovy 腳本步驟中的想法/sudo 代碼是
這是 groovy 腳本:
/**
* Model object for comparing
*/
@groovy.transform.Canonical
class Model {
def id
def name
def type
def isProductTag
def isLocationTag
def subSection
def section
def subGroup
def group
/**
* this will acception jdbc row
* @param row
* @return
*/
def buildJdbcData(row) {
row.with {
id = ID
name = NAME
type = TYPE
isProductTag = ISPRODUCTTAG
isLocationTag = ISLOCATIONTAG
subSection = SUBSECTION
section = SECTION
subGroup = SUBGROUP
group = GROUP
}
}
/**
* this will accept the json TagInfo
* @param tagInfo
* @return
*/
def buildJsonData(tagInfo){
id = tagInfo.@id
name = tagInfo.@name
type = tagInfo.@type
isProductTag = tagInfo.@isProductTag
isLocationTag = tagInfo.@isLocationTag
subSection = tagInfo.@subsection
section = tagInfo.@section
subGroup = tagInfo.@subgroup
group = tagInfo.@group
}
}
/**
* Creating the jdbcResponse from the response received, using fixed value for testing
* If you want, you can assign the response received directly using below instead of current and make sure you replace the step name correctly
* def jdbcResponse = context.expand('${JdbcStepName#Response}')
*/
def jdbcResponse = '''<Results>
<ResultSet fetchSize="128">
<Row rowNumber="1">
<ID>1</ID>
<NAME>TestName1</NAME>
<DESCRIPTION/>
<TYPE>Bool</TYPE>
<ISPRODUCTTAG>true</ISPRODUCTTAG>
<ISLOCATIONTAG>false</ISLOCATIONTAG>
<SUBSECTION>Default Sub Section</SUBSECTION>
<SECTION>Default Section</SECTION>
<SUBGROUP>Default Sub Group</SUBGROUP>
<GROUP>Default Group</GROUP>
</Row>
<Row rowNumber="2">
<ID>2</ID>
<NAME>TestName2</NAME>
<DESCRIPTION/>
<TYPE>Bool</TYPE>
<ISPRODUCTTAG>true</ISPRODUCTTAG>
<ISLOCATIONTAG>false</ISLOCATIONTAG>
<SUBSECTION>Default Sub Section</SUBSECTION>
<SECTION>Default Section</SECTION>
<SUBGROUP>Default Sub Group</SUBGROUP>
<GROUP>Default Group</GROUP>
</Row>
<!--added 3rd row for testing the failure -->
<Row rowNumber="3">
<ID>3</ID>
<NAME>TestName3</NAME>
<DESCRIPTION/>
<TYPE>Bool</TYPE>
<ISPRODUCTTAG>false</ISPRODUCTTAG>
<ISLOCATIONTAG>false</ISLOCATIONTAG>
<SUBSECTION>Default Sub Section3</SUBSECTION>
<SECTION>Default Section3</SECTION>
<SUBGROUP>Default Sub Group3</SUBGROUP>
<GROUP>Default Group3</GROUP>
</Row>
</ResultSet>
</Results>'''
/**
* Creating the jsonResponse from the response received, using fixed value for testing
* If you want, you can assign the response received directly using below instead of current and make sure you replace the step name correctly
* def jsonResponse = context.expand('${JsonStepName#Response}')
*/
def restResponse = '''
<ArrayOfTagInfo>
<TagInfo id="1" name="TestName1" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
<TagInfo id="2" name="TestName2" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
<!--added 3rd row for testing the failure -->
<TagInfo id="3" name="TestName3" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
</ArrayOfTagInfo>'''
//Parsing the jdbc and build the jdbc model object list
def results = new XmlSlurper().parseText(jdbcResponse)
def jdbcDataObjects = []
results.ResultSet.Row.each { row ->
jdbcDataObjects.add(new Model().buildJdbcData(row))
}
//Parsing the json and build the json model object list
def arrayOfTagInfo = new XmlSlurper().parseText(restResponse)
def jsonDataObjects = []
arrayOfTagInfo.TagInfo.each { tagInfo ->
jsonDataObjects.add(new Model().buildJsonData(tagInfo))
}
//sorting the Data before checking for equality
jdbcDataObjects.sort()
jsonDataObjects.sort()
if (jdbcDataObjects.size() != jsonDataObjects.size()) {
System.err.println("Jdbc resultset size is : ${jdbcDataObjects.size()} and Json result size is : ${jsonDataObjects.size()}")
}
assert jdbcDataObjects == jsonDataObjects, "Comparison of Jdbc and Json data is failed"
在上面,第 3 行不匹配,因此 assert 將拋出以下錯誤:
捕獲:java.lang.AssertionError:比較失敗。 表達式:(jdbcDataObjects == jsonDataObjects)。 值:jdbcDataObjects = [默認組 3,默認組,默認組],jsonDataObjects = [默認組,默認組,默認組] java.lang.AssertionError:比較失敗。 表達式:(jdbcDataObjects == jsonDataObjects)。 值:jdbcDataObjects = [默認組 3,默認組,默認組],jsonDataObjects = [默認組,默認組,默認組] 在 So31472381.run(So31472381.groovy:104)
進程以退出代碼 1 結束
如果刪除 3rd(從兩個響應中),則不會看到任何錯誤,這表明 jdbc 和 json 響應的比較成功。
請注意,免費版和專業版的
SoapUI
都提供groovy script
。 所以這個解決方案適用於 SoapUI 的兩個版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.