将JDBC响应与XML响应进行比较,其中节点数量有所不同,顺序可能会发生变化? [英] Compare JDBC Response to an XML Response where number of nodes vary and order could change?

查看:128
本文介绍了将JDBC响应与XML响应进行比较,其中节点数量有所不同,顺序可能会发生变化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对编码非常陌生,在尝试将JDBC查询的结果与XML响应中的结果进行比较时遇到了一些麻烦。

我使用groovy而不是内置于SoapUI的XPATH,因为根据我请求中传递的参数,返回的节点数量可能会有所不同,我需要验证所有这些参数。

我使用我发现的各种示例构建了下面的脚本,因为我找不到一个可以做我想做的示例。我将类标签中的所有内容插入到eclipse中,并且没有检测到任何语法错误。但是,当我在SoapUI中运行脚本时,当它到达解析xml响应的部分时,没有任何内容。然后我的验证和断言当然失败了。 JDBC数据构建得很好。



感谢您提供任何帮助。

  import com.eviware .soapui.support.XmlHolder 
导入groovy.xml.XmlUtil
导入groovy.util.XmlSlurper
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)


class模型{
def campaignSysKey
def campaignName
def startDate
def endDate
def campaignCode

def buildJdbcData(row){
row.with {
campaignSysKey = UPGRADETYPE
campaignName = SOURCEDESC
startDate = STARTDATE $ b $ endDate = ENDDATE
campaignCode = SOURCECODE



def buildXMLData(tagInfo){
campaignSysKey = tagInfo。@ campaignSysKey
campaignName = tagInfo。@ @ campaignName $ b $ startDate = tagInfo。 @startDate
endDate = tagInfo。@ endDate
campaignCode = tagInfo。@ campaignCode


$ b $ def jdbcResponse = context.expand('$ {Validation#ResponseAsXml}')
def xmlResponse = context.expand('$ {OfferHistoryRequest# Response}')

def results = new XmlSlurper()。parseText(jdbcResponse)
def jdbcDataObjects = []
results.ResultSet.Row.each {row - >
jdbcDataObjects.add(new Model()。buildJdbcData(row))
}
$ b $ def arrayOfTagInfo = new XmlSlurper()。parseText(xmlResponse)
def xmlDataObjects = []
arrayOfTagInfo.TagInfo.each {tagInfo - >
xmlDataObjects.add(new Model()。buildXMLData(tagInfo))
}

log.info$ {jdbcDataObjects.size()}
log。 info$ {xmlDataObjects.size()}


if(jdbcDataObjects.size()!= xmlDataObjects.size()){
log.info(Jdbc resultset大小为:$ {jdbcDataObjects.size()},XML结果大小为:$ {xmlDataObjects.size()})

}


断言jdbcDataObjects == xmlDataObjects,JDBC和XML数据比较失败

JDBC响应结构:

 < Results> 
< ResultSet fetchSize =0>
< Row rowNumber =1>
< UPGRADETYPE> 1< / UPGRADETYPE>
< SOURCEDESC>描述1< / SOURCEDESC>
< STARTDATE> 2015-01-01< / STARTDATE>
< ENDDATE> 2017-12-31< / ENDDATE>
< SOURCECODE> ABC123< / SOURCECODE>
< /行>
< Row rowNumber =2>
< UPGRADETYPE> 2< / UPGRADETYPE>
< SOURCEDESC> Desc 2< / SOURCEDESC>
< STARTDATE> 2015-01-01< / STARTDATE>
< ENDDATE> 2017-12-31< / ENDDATE>
< SOURCECODE> XYZ987< / SOURCECODE>
< /行>
< / ResultSet>
< / Results>

XML响应(有意删除了Holding标签之间的数据,但留下来显示响应结构。我只关心Campaign节点):

 < soap:Envelope xmlns:soap =http:// sample。组织> 
< soap:Body>
< TXLife xmlns =http://sample.org>
< TXLifeResponse>
< TransRefGUID> 123456< / TransRefGUID>
< TransType tc =999/>
< TransSubType tc =9909/>
< BusinessService DataRep =VIEW/>
< TransExeDate> 2017-01-19-05:00< / TransExeDate>
< TransExeTime> 09:19:30.668-05:00< / TransExeTime>
< StartRecord> 1< / StartRecord>
< TransResult>
< ResultCode tc =1/>
< RecordsFound> 2< / RecordsFound>
< / TransResult>
< OLIFE>
< Holding id =Holding_B1234567>
< / Holding>
< Campaign id =Campaign_B1234567_1AppliesToCoverageID =Coverage_B1234567_1>
< CampaignSysKey> 1< / CampaignSysKey>
< CampaignName> Desc 1< / CampaignName>
< StartDate> 2015-01-01< / StartDate>
< EndDate> 2017-12-31< / EndDate>
< CampaignCode> ABC123< / CampaignCode>
< / Campaign>
< Campaign id =Campaign_B1234567_2AppliesToCoverageID =Coverage_B1234567_2>
< CampaignSysKey> 2< / CampaignSysKey>
< CampaignName>说明2< / CampaignName>
< StartDate> 2015-01-01< / StartDate>
< EndDate> 2017-12-31< / EndDate>
< CampaignCode> XYZ987< / CampaignCode>
< / Campaign>
< / OLIFE>
< / TXLifeResponse>
< / TXLife>
< / soap:Body>
< / soap:Envelope>

来自SoapUI日志的错误:



<$ p $ > Thu Jan 19 10:00:31 EST 2017:错误:java.lang.AssertionError:JDBC和XML数据的比较失败。表达式:(jdbcDataObjects == xmlDataObjects)。值:jdbcDataObjects = [X34143,X33582],xmlDataObjects = []
java.lang.AssertionError:比较JDBC和XML数据失败。表达式:(jdbcDataObjects == xmlDataObjects)。值:jdbcDataObjects = [X34143,X33582],xmlDataObjects = []
位于org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:404)
位于org.codehaus.groovy.runtime。 ScriptBytecodeAdapter.assertFailed(ScriptBytecodeAdapter.java:650)
在Script5.run(Script5.groovy:67)
在com.eviware.soapui.support.scripting.groovy.SoapUIGroovyScriptEngine.run(SoapUIGroovyScriptEngine.java: 92)
at com.eviware.soapui.support.scripting.groovy.SoapUIProGroovyScriptEngineFactory $ SoapUIProGroovyScriptEngine.run(SoapUIProGroovyScriptEngineFactory.java:79)
at com.eviware.soapui.impl.wsdl.teststeps.WsdlGroovyScriptTestStep。运行(WsdlGroovyScriptTestStep.java:156)
at com.eviware.soapui.impl.wsdl.panels.teststeps.GroovyScriptStepDesktopPanel $ RunAction $ 1.run(GroovyScriptStepDesktopPanel.java:274)
at java.util.concurrent .ThreadPoolExecutor.runWorker(Unknown Source)$ java.util.concurrent.ThreadPoolExecutor
$ Worker.run(Unknown Sou rce)
at java.lang.Thread.run(Unknown Source)


解决方案



您在下面编写和解决的脚本中存在的问题 -




  • xml元素没有正确读取

  • 使方法变为静态

  • Canonical注释添加到类中,以便它可以进行比较


$ b Groovy脚本

//用于建模不同数据源的类以及创建对象
//以便这些可比较的
@ groovy.transform.Canonical
class模型{
字符串campaignSysKey
字符串campaignName
字符串startDate
字符串endDate
字符串campaignCode

static def buildJdbcData(row){
def obj = new Model()
row.with {
obj.campaignSysKe y = UPGRADETYPE
obj.campaignName = SOURCEDESC
obj.startDate = STARTDATE
obj.endDate = ENDDATE
obj.campaignCode = SOURCECODE
}
obj


静态定义buildXMLData(cmpgn){
def obj = new Model()
obj.campaignSysKey = cmpgn.CampaignSysKey as String
obj.campaignName = cmpgn.CampaignName as String
obj.startDate = cmpgn.StartDate as String
obj.endDate = cmpgn.EndDate as String
obj.campaignCode = cmpgn.CampaignCode as String
obj



//从它的步骤
读取jdbc响应def jdbcResponse = context.expand('$ {Validation#ResponseAsXml}')

//从步骤
读取xml响应def xmlResponse = context.expand('$ {OfferHistoryRequest#Response}')

//读取&为jdbc响应创建对象
def results = new XmlSlurper()。parseText(jdbcResponse)
def jdbcDataObjects = []
results.ResultSet.Row.each {row - >
jdbcDataObjects.add(Model.buildJdbcData(row))
}

//读取&为xml响应创建对象
def parsedXml = new XmlSlurper()。parseText(xmlResponse)
def campaigns = parsedXml。'**'。findAll {it.name()=='Campaign'}
def xmlDataObjects = []
campaigns.each {cmpgn - >
xmlDataObjects.add(Model.buildXMLData(cmpgn))
}

//记录两个响应
log.infoJdbc响应记录:$ {jdbcDataObjects.size ()}
log.infoXml响应记录:$ {xmlDataObjects.size()}


if(jdbcDataObjects.size()!= xmlDataObjects.size )){
log.info(Jdbc结果集大小为:$ {jdbcDataObjects.size()},XML结果大小为:$ {xmlDataObjects.size()})
}

//检查两个对象大小在比较一对一之前是否相等
断言jdbcDataObjects.size()== xmlDataObjects.size(),两个响应都没有匹配元素数

//记录两个对象
log.info jdbcDataObjects.toString()
log.info xmlDataObjects.toString()

//比较两个响应并显示
if(jdbcDataObjects!= xmlDataObjects){
log.info两个响应不匹配
for(int index = 0; index< jdbcDataObjects.size(); index ++){
断言jdbcDataObjects [index] == xmlDataObjects [index],响应@ $ {index + 1}的位置不匹配
}
} else {
log.info两个响应都匹配

顺便说一下,您发布的回复有所不同。



如果您想快速在线查看 demo

p>

I am very new to coding and am having some trouble when attempting to compare the results from a JDBC query to the results in an XML response.

I am using groovy rather than XPATH built into SoapUI because based on the parameters passed in my request, the number of nodes returned could vary and I need to validate all of them.

I built the script below using various examples that I found since I could not find one single example that was going to do what I wanted. I plugged in everything from the class tag down into eclipse and it did not detect any syntax errors. However, when I run the script in SoapUI, when it reaches the part to parse the xml response, nothing is built. Then my validations and assertions fail of course. The JDBC data built just fine.

Thanks in advance for any assistance.

import com.eviware.soapui.support.XmlHolder
import groovy.xml.XmlUtil
import groovy.util.XmlSlurper
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)


class Model {
    def campaignSysKey
    def campaignName
    def startDate
    def endDate
    def campaignCode

    def buildJdbcData(row) {
        row.with {
            campaignSysKey = UPGRADETYPE
            campaignName = SOURCEDESC
            startDate = STARTDATE
            endDate = ENDDATE
            campaignCode = SOURCECODE
        }
    }

    def buildXMLData(tagInfo) {
        campaignSysKey = tagInfo.@campaignSysKey
        campaignName = tagInfo.@campaignName
        startDate = tagInfo.@startDate
        endDate = tagInfo.@endDate
        campaignCode = tagInfo.@campaignCode
    }
}

def jdbcResponse = context.expand('${Validation#ResponseAsXml}')
def xmlResponse = context.expand('${OfferHistoryRequest#Response}')

def results = new XmlSlurper().parseText(jdbcResponse)
def jdbcDataObjects = []
results.ResultSet.Row.each { row ->
    jdbcDataObjects.add(new Model().buildJdbcData(row))
}

def arrayOfTagInfo = new XmlSlurper().parseText(xmlResponse)
def xmlDataObjects = []
arrayOfTagInfo.TagInfo.each { tagInfo ->
    xmlDataObjects.add(new Model().buildXMLData(tagInfo))
}

log.info "${jdbcDataObjects.size()}"
log.info "${xmlDataObjects.size()}"


if (jdbcDataObjects.size() != xmlDataObjects.size()) {
    log.info("Jdbc resultset size is : ${jdbcDataObjects.size()} and XML result size is : ${xmlDataObjects.size()}")

}


assert jdbcDataObjects == xmlDataObjects, "Comparison of JDBC and XML data is failed"

JDBC Response Structure:

<Results>
   <ResultSet fetchSize="0">
      <Row rowNumber="1">
         <UPGRADETYPE>1</UPGRADETYPE>
         <SOURCEDESC>Desc 1</SOURCEDESC>
         <STARTDATE>2015-01-01</STARTDATE>
         <ENDDATE>2017-12-31</ENDDATE>
         <SOURCECODE>ABC123</SOURCECODE>
      </Row>
      <Row rowNumber="2">
         <UPGRADETYPE>2</UPGRADETYPE>
         <SOURCEDESC>Desc 2</SOURCEDESC>
         <STARTDATE>2015-01-01</STARTDATE>
         <ENDDATE>2017-12-31</ENDDATE>
         <SOURCECODE>XYZ987</SOURCECODE>
      </Row>
   </ResultSet>
</Results>

XML Response (Removed data between the Holding tags intentionally, but left them in to show structure of response. I am only concerned with the Campaign nodes):

<soap:Envelope xmlns:soap="http://sample.org">
   <soap:Body>
      <TXLife xmlns="http://sample.org">
         <TXLifeResponse>
            <TransRefGUID>123456</TransRefGUID>
            <TransType tc="999"/>
            <TransSubType tc="9909"/>
            <BusinessService DataRep="VIEW"/>
            <TransExeDate>2017-01-19-05:00</TransExeDate>
            <TransExeTime>09:19:30.668-05:00</TransExeTime>
            <StartRecord>1</StartRecord>
            <TransResult>
               <ResultCode tc="1"/>
               <RecordsFound>2</RecordsFound>
            </TransResult>
            <OLifE>
               <Holding id="Holding_B1234567">                  
               </Holding>
               <Campaign id="Campaign_B1234567_1" AppliesToCoverageID="Coverage_B1234567_1">
                  <CampaignSysKey>1</CampaignSysKey>
                  <CampaignName>Desc 1</CampaignName>
                  <StartDate>2015-01-01</StartDate>
                  <EndDate>2017-12-31</EndDate>
                  <CampaignCode>ABC123</CampaignCode>
               </Campaign>
               <Campaign id="Campaign_B1234567_2" AppliesToCoverageID="Coverage_B1234567_2">
                  <CampaignSysKey>2</CampaignSysKey>
                  <CampaignName>Desc 2</CampaignName>
                  <StartDate>2015-01-01</StartDate>
                  <EndDate>2017-12-31</EndDate>
                  <CampaignCode>XYZ987</CampaignCode>
               </Campaign>
            </OLifE>
         </TXLifeResponse>
      </TXLife>
   </soap:Body>
</soap:Envelope>

Error from SoapUI Log:

Thu Jan 19 10:00:31 EST 2017:ERROR:java.lang.AssertionError: Comparison of JDBC and XML data is failed. Expression: (jdbcDataObjects == xmlDataObjects). Values: jdbcDataObjects = [X34143, X33582], xmlDataObjects = []
   java.lang.AssertionError: Comparison of JDBC and XML data is failed. Expression: (jdbcDataObjects == xmlDataObjects). Values: jdbcDataObjects = [X34143, X33582], xmlDataObjects = []
    at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:404)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(ScriptBytecodeAdapter.java:650)
    at Script5.run(Script5.groovy:67)
    at com.eviware.soapui.support.scripting.groovy.SoapUIGroovyScriptEngine.run(SoapUIGroovyScriptEngine.java:92)
    at com.eviware.soapui.support.scripting.groovy.SoapUIProGroovyScriptEngineFactory$SoapUIProGroovyScriptEngine.run(SoapUIProGroovyScriptEngineFactory.java:79)
    at com.eviware.soapui.impl.wsdl.teststeps.WsdlGroovyScriptTestStep.run(WsdlGroovyScriptTestStep.java:156)
    at com.eviware.soapui.impl.wsdl.panels.teststeps.GroovyScriptStepDesktopPanel$RunAction$1.run(GroovyScriptStepDesktopPanel.java:274)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

解决方案

Here is the script which I corrected to make it work.

The problems in the script you made and addressed as below -

  • xml elements are not read properly
  • made the methods static
  • Canonical annotation added to class so that it allows to comparable

Groovy Script

//Class to model the different sources of data and create object
//so that those are comparable
@groovy.transform.Canonical
class Model {
    String campaignSysKey
    String campaignName
    String startDate
    String endDate
    String campaignCode

    static def buildJdbcData(row) {
        def obj = new Model()
        row.with {
            obj.campaignSysKey = UPGRADETYPE
            obj.campaignName = SOURCEDESC
            obj.startDate = STARTDATE
            obj.endDate = ENDDATE
            obj.campaignCode = SOURCECODE
        }
        obj
    }

    static def buildXMLData(cmpgn) {
        def obj = new Model()
        obj.campaignSysKey = cmpgn.CampaignSysKey as String
        obj.campaignName = cmpgn.CampaignName as String
        obj.startDate = cmpgn.StartDate as String
        obj.endDate = cmpgn.EndDate as String
        obj.campaignCode = cmpgn.CampaignCode as String
        obj
    }
}

//Read the jdbc response from its step 
def jdbcResponse = context.expand('${Validation#ResponseAsXml}')

//Read the xml response from its step
def xmlResponse = context.expand('${OfferHistoryRequest#Response}')

//Read & Create objects for jdbc response
def results = new XmlSlurper().parseText(jdbcResponse)
def jdbcDataObjects = []
results.ResultSet.Row.each { row ->
    jdbcDataObjects.add(Model.buildJdbcData(row))
}

//Read & Create objects for xml response
def parsedXml = new XmlSlurper().parseText(xmlResponse)
def campaigns = parsedXml.'**'.findAll{it.name() == 'Campaign'}
def xmlDataObjects = []
campaigns.each { cmpgn ->
    xmlDataObjects.add(Model.buildXMLData(cmpgn))
}

//Log both responses
log.info "Jdbc response records: ${jdbcDataObjects.size()}"
log.info "Xml response records: ${xmlDataObjects.size()}"


if (jdbcDataObjects.size() != xmlDataObjects.size()) {
    log.info("Jdbc resultset size is : ${jdbcDataObjects.size()} and XML result size is : ${xmlDataObjects.size()}") 
}

//Check if both object sizes are equal before comparing one to one
assert jdbcDataObjects.size() == xmlDataObjects.size(), "Both responses have not matched element count"

//Log both the objects
log.info jdbcDataObjects.toString()
log.info xmlDataObjects.toString()

//Compare now both the responses and show the difference
if (jdbcDataObjects != xmlDataObjects){
    log.info "Both responses do not match"
    for(int index=0;index<jdbcDataObjects.size();index++){
        assert jdbcDataObjects[index] == xmlDataObjects[index], "Responses @ ${index+1} position do not match"
    }
} else {
    log.info "Both responses matches"
}

By the way, the responses you posted have difference.

If you want to quickly check online demo

这篇关于将JDBC响应与XML响应进行比较,其中节点数量有所不同,顺序可能会发生变化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆