SoapUI Сравнение двух XML-ответов невероятно медленно - PullRequest
0 голосов
/ 22 января 2019

В моем тестовом примере у меня есть два шага теста, которые производят XML-ответ.Структура XML немного отличается друг от друга, но данные одинаковы и упорядочены одинаково.

Я создал шаг теста Groovy Script, который будет считывать итерации данных из обоих XML-файлов и утверждать, что они равны.Количество строк в этом XML-ответе может превышать 500 строк.

Тестовый набор повторяется более 349 раз.

Когда я запускаю тестовый пример, он отстает от скриптового утверждения для первого проходного цикла - на его выполнение уходит более 5 минут.Я пытаюсь найти способ улучшить текущий сценарий или лучше сравнить два ответа XML.

Ответ JDBC:

<Results>
   <ResultSet fetchSize="128">
      <Row rowNumber="1">
         <id>1540107</id>
         <name>10C/Ar1</name>
         <code>10C/Ar1</code>
         <subjectId>349176</subjectId>
      </Row>
      <Row rowNumber="2">
         <id>1540108</id>
         <name>11A/Ar1</name>
         <code>11A/Ar1</code>
         <subjectId>349177</subjectId>
      </Row>
      ...

REST Response:

<Response>
   <e>
      <id>1540107</id>
      <name>10C/Ar1</name>
      <code>10C/Ar1</code>
      <subjectId>349176</subjectId>
   </e>
   <e>
      <id>1540108</id>
      <name>11A/Ar1</name>
      <code>11A/Ar1</code>
      <subjectId>349177</subjectId>
   </e>
   ...

Groovy Сценарий:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);

//API Response
def HolderA = groovyUtils.getXmlHolder(context.expand('${01_Test_Step_05#ResponseAsXml}'))
def CountA = HolderA.getNodeValues("//e").size();
log.info CountA

//Database Query Response
def HolderB = groovyUtils.getXmlHolder(context.expand('${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]}'))
def CountB = HolderB.getNodeValues("//Row").size();
log.info CountB

//Asser Response Sizes
assert CountA == CountB : 'Response Counts Dont Equal'

def i = 1

while(i < (CountA + 1)) {
    //API Response Elements
    def id_A = context.expand( '${01_Test_Step_05#ResponseAsXml#//e[' + i + ']/id}' )
    def name_A = context.expand( '${01_Test_Step_05[GET]#ResponseAsXml#//e[' + i + ']/name}' )
    def code_A = context.expand( '${01_Test_Step_05[GET]#ResponseAsXml#//e[' + i + ']/code}' )
    def subjectId_A = context.expand( '${01_Test_Step_05[GET]#ResponseAsXml#//e[' + i + ']/subjectId}' )

    //Database Query Response Elements
    def id_B = context.expand( '${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]/Row[' + i + ']/id}' )
    def name_B = context.expand( '${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]/Row[' + i + ']/name}' )
    def code_B = context.expand( '${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]/Row[' + i + ']/code}' )
    def subjectId_B = context.expand( '${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]/Row[' + i + ']/subjectId}' )

    //Assert API Response Elements & Database Query Response Elements
    assert id_A == id_B : 'Mismatching IDs'
    assert name_A == name_B : 'Mismatching Names'
    assert code_A == code_B : 'Mismatching Codes'
    assert subjectId_A == subjectId_B : 'Mismatching Subject IDs'

    i++
}

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Существует простой способ сделать это, но этот способ не будет выделять то, что не соответствует между 2 XML. Это обязательно скажет вещи, которые не совпали

   <ResultSet fetchSize="128">
      <Row rowNumber="1">
         <id>1540107</id>
         <name>10C/Ar1</name>
         <code>10C/Ar1</code>
         <subjectId>349176</subjectId>
      </Row>
      <Row rowNumber="2">
         <id>1540108</id>
         <name>11A/Ar1</name>
         <code>11A/Ar1</code>
         <subjectId>349177</subjectId>
      </Row>

        </ResultSet>
            </Results>
      '''

def xml2='''<Response>
   <e>
      <id>1540107</id>
      <name>10C/Ar1</name>
      <code>10C/Ar1</code>
      <subjectId>349176</subjectId>
   </e>
   <e>
      <id>1540108</id>
      <name>11A/Ar1</name>
      <code>11A/Ar1</code>
      <subjectId>349177</subjectId>
   </e>
   </Response>'''

def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
def x1=   groovyUtils.getXmlHolder(xml1)
def x2=   groovyUtils.getXmlHolder(xml2)

def a1=x1.getNodeValues("//*:Row/*")
def a2=x2.getNodeValues("//*:e/*")

if(a1.toString()==a2.toString())
{
    log.info "Values matched in both XML for values"
}
else
{
    log.error "Values did not matched in both XML for values"
}


Несмотря на то, что это трудно отладить относительно того, где произошла ошибка, но это эффективный способ сравнения всех значений в XML. Вы даже можете сравнить на разных уровнях узлов.

Этот еще проще понять по сравнению с XMLParser enter image description here

0 голосов
/ 22 января 2019

Я считаю, что ваш много контекстный. Расширение является дорогой частью.

Я бы использовал XmlSlurper, а затем просто перебрал бы строки.

Я предполагаю, что строки упорядочены одинаково.

Вам нужно будет настроить строки 3 и 4 в соответствии с вашими потребностями, чтобы правильно получить XML. Для целей тестирования я просто добавил два небольших скрипта Groovy, которые возвращали XML, необходимый для тестирования.

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);

def request1 = testRunner.testCase.getTestStepByName("Xml1").getPropertyValue("result")
def request2 = testRunner.testCase.getTestStepByName("Xml2").getPropertyValue("result")

def slurper = new XmlSlurper()
def req1 = slurper.parseText(request1)
def req2 = slurper.parseText(request2)

def size1 = req1.ResultSet.Row.size()
def size2 = req2.e.Row.size()
assert size1 == size2 : 'Response Counts Dont Equal'

for (def x=0 ; x<size1 ; x++) {
    assert req1.ResultSet.Row[x].id == req2.e.Row[x].id : 'Mismatching IDs in row ' + x + " values " +  req1.ResultSet.Row[x].id + " / " + req2.e.Row[x].id
    assert req1.ResultSet.Row[x].name == req2.e.Row[x].name : 'Mismatching Names in row ' + x + " values " +  req1.ResultSet.Row[x].name + " / " + req2.e.Row[x].name
    assert req1.ResultSet.Row[x].code == req2.e.Row[x].code : 'Mismatching Codes in row ' + x + " values " +  req1.ResultSet.Row[x].code + " / " + req2.e.Row[x].code
    assert req1.ResultSet.Row[x].subjectId == req2.e.Row[x].subjectId : 'Mismatching SubjectIds in row ' + x + " values " +  req1.ResultSet.Row[x].subjectId + " / " + req2.e.Row[x].subjectId
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...