2017-01-18 1 views
1

Я очень новичок в кодировании, и у меня возникают проблемы при попытке сравнить результаты запроса JDBC с результатами в ответе XML.Сравнение ответа JDBC на ответ XML, где количество узлов меняется и порядок может меняться?

Я использую groovy, а не XPATH, встроенный в SoapUI, потому что на основе параметров, переданных в моем запросе, количество возвращаемых узлов может меняться, и мне нужно проверить их все.

Я построил сценарий ниже, используя различные примеры, которые я нашел, так как я не мог найти один пример, который собирался делать то, что я хотел. Я включил все из тега класса в eclipse и не обнаружил никаких синтаксических ошибок. Однако, когда я запускаю скрипт в SoapUI, когда он достигает части для анализа ответа xml, ничего не строится. Тогда мои утверждения и утверждения терпят неудачу, конечно. Данные JDBC построены просто отлично.

Заранее благодарим за любую помощь.

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 = [email protected] 
     campaignName = [email protected] 
     startDate = [email protected] 
     endDate = [email protected] 
     campaignCode = [email protected] 
    } 
} 

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 Ответ Структура:

<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-ответ (Удалены данные между тегами Holding намеренно, но оставил их, чтобы показать структуру ответа я озабочен только с узлами кампании.):

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

Ошибка из SoapUI Вход:

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) 
+0

Вы должны показать данные, напоминающих точный формат как ответ, который вы хотели бы сравнить. – Rao

+0

В противном случае вы можете пройти через [это] (http://stackoverflow.com/questions/31472381/dynamically-compare-rest-xml-json-response-and-jdbc-using-groovy-array-in-soapui/35706976 # 35706976) задайте вопрос еще раз, чтобы лучше понять, поскольку в нем также содержатся образцы данных. Но сценарий может меняться в зависимости от данных. – Rao

+0

Я посмотрел на этот вопрос, это на самом деле то, что я смоделировал из моего сценария, я просто не мог найти его снова для ссылки в моем оригинальном посте. Я не знаю, является ли проблема тем, что скрипт сравнивает ответ JSON, и я хочу использовать XML. Если я перекодирую значения в переменную xmlResponse, я могу проверить ее успешно. Проблема в том, что я пытаюсь сделать это ссылкой на фактический ответ XML. Я обновил свое исходное сообщение с помощью структуры JDBC и ответа XML. – JesseN

ответ

0

Вот сценарий, который я исправил, чтобы заставить его работать.

Проблемы в сценарии вы сделали и адрес, как показано ниже -

  • XML-элементы не читаются правильно
  • сделала статические методы
  • Canonical аннотации добавлена ​​к классу так, что она позволяет сравнимую

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" 
} 

Кстати, ответы, которые вы опубликовали, имеют разницу.

Если вы хотите быстро проверить онлайн demo

+0

Это сработало отлично. Я сделал опечатку, когда я вставил запросы, когда удалил фактические данные, сгенерированные с образцовыми данными. Я обновляю свой пост, чтобы данные были согласованы. Благодарю. – JesseN

Смежные вопросы