Вопрос по SOAP UI!!


(Евгений_Л) #1

  Уважаемые ГУРУ , подскажите как с помощью груви скрипта добавлять в Реквест теги?? К примеру:

.......

<entityType>бла бла</entityType>

       <fieldList>
              <field>номер 1</field>
              <field>номер 2 </field>
               <field>номер 3</field>
              <field>номер 4</field>

        </fieldList>

.........

мне от запроса к запросу нужно варьировать количество   <field></field> тегов. Как их наполнить я знаю, но как из добавлять и удалять ???? 

Заранее благодарен.


(Mykhailo Poliarush) #2

я думаю по этой ссылке вы найде необходимый для вас код http://groovy.codehaus.org/Processing+XML

ну например код из страницы http://groovy.codehaus.org/Updating+XML+with+XmlParser

 

// require(groupId:'xmlunit', artifactId:'xmlunit', version:'1.1')
import org.custommonkey.xmlunit.Diff
import org.custommonkey.xmlunit.XMLUnit

def input = '''
<shopping>
    <category type="groceries">
        <item>Chocolate</item>
        <item>Coffee</item>
    </category>
    <category type="supplies">
        <item>Paper</item>
        <item quantity="4">Pens</item>
    </category>
    <category type="present">
        <item when="Aug 10">Kathryn's Birthday</item>
    </category>
</shopping>
'''

def expectedResult = '''
<shopping>
  <category type="groceries">
    <item>Luxury Chocolate</item>
    <item>Luxury Coffee</item>
  </category>
  <category type="supplies">
    <item>Paper</item>
    <item quantity="6" when="Urgent">Pens</item>
  </category>
  <category type="present">
    <item>Mum's Birthday</item>
    <item when="Oct 15">Monica's Birthday</item>
  </category>
</shopping>
'''

def root = new XmlParser().parseText(input)

// modify groceries: quality items please
def groceries = root.category.findAll{ it.@type == 'groceries' }.item[0]
groceries.each { g ->
    g.value = 'Luxury ' + g.text()
}

// modify supplies: we need extra pens
def supplies = root.category.findAll{ it.@type == 'supplies' }.item[0]
supplies.findAll{ it.text() == 'Pens' }.each { s ->
    s.@quantity = s.@quantity.toInteger() + 2
    s.@when = 'Urgent'
}

// modify presents: August has come and gone
def presentCategory = root.category.find{ it.@type == 'present' }
presentCategory.children().clear()
presentCategory.appendNode('item', "Mum's Birthday")
presentCategory.appendNode('item', [when:'Oct 15'], "Monica's Birthday")

// check the when attributes
def removeNulls(list) { list.grep{it} }
assert removeNulls(root.'**'.item.@when) == ["Urgent", "Oct 15"]

// check the whole document using XmlUnit
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(root)
def result = writer.toString()

XMLUnit.setIgnoreWhitespace(true)
def xmlDiff = new Diff(result, expectedResult)
assert xmlDiff.identical()

или вам нужен точечный пример решения вашей задачи?


(Taras) #3

такое лучше написать на JAVA, использовать String tokanizer просто имитировать ваши теги как строку и модифицировать ее по алгоритму, какой Вам там нужен, но не осбо понимаю какой ето тип сервиса такие манипуляции требует ??

Можете поподробнее расказать что такое теги для реквеста...


(Евгений_Л) #4

 

или вам нужен точечный пример решения вашей задачи?
n/a

 

Опыт в этой области  у меня достаточно мал, поэтому если не сложно    подробнее о конкретной ситуации. 

Заранее благодарен.


(Mykhailo Poliarush) #5

я думаю вот этот пост дает четкое представление как это можно сделать

http://stackoverflow.com/questions/11115491/convert-string-xml-fragment-to-document-node-in-groovy

 

 

Given the xml that you currently have:

String doc = '''<entityProps>
               |  <candidate> <id>1</id><key></key> </candidate>
               |  <candidate> <id>2</id><key></key> </candidate>
               |  <candidate> <id>3</id><key></key> </candidate>
               |  <candidate> <id>4</id><key></key> </candidate>
               |</entityProps>'''.stripMargin()

And a fragment String:

String frag = '<candidate> <id>5</id><key></key> </candidate>'

You can parse the document:

def xml = new XmlSlurper().parseText( doc )

And the fragment:

def fragxml = new XmlSlurper().parseText( frag )

Then, append the fragment to the root node of the document:

xml.appendNode( fragxml )

And stream this document back into a String:

String newDoc = new groovy.xml.StreamingMarkupBuilder().bind { mkp.yield xml }
println newDoc

That prints:

<entityProps>
  <candidate><id>1</id><key></key></candidate>
  <candidate><id>2</id><key></key></candidate>
  <candidate><id>3</id><key></key></candidate>
  <candidate><id>4</id><key></key></candidate>
  <candidate><id>5</id><key></key></candidate>
</entityProps>

(I added the newlines myself to make it easier to read... the actual String you get is all on one line)


(tisaser) #6

такое лучше написать на JAVA

Ой ну не надо только человека вводить в заблуждение. Вот что есть груви согласно http://groovy.codehaus.org/:

 

  • is an agile and dynamic language for the Java Virtual Machine
  • builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby and Smalltalk.

Все правильно товарищ polusok написал. Строите свой SOAP реквест (полсностью или частично) и печатаете его в string. В SOAPUI в редакторе реквеста пишете ссылку на результат работы скрипта. Вынесите еще это все в groovy библиотеку.

Можно конечно все через String написать но это имхо как то не совсем правильно, хотя для Вашего случая наверное будет быстрее. С другой стороны, если Вам понадобится в дальнейшем улучшить (усложнить) постоитель SOAP запросов, то используя XML библиотеки это сделать будет проще, чем просто  String. Самые простые библиотеки для работы с XML в groovy (уже встроены) это XmlParser и  XmlSlupper. Обе поддерживают не только запросы но и изменение/добавление тегов/значений и т.д. 

 


(Taras) #7

да какое заблуждение, ИМХО писать на чистой Java в Soap UI проще чем на Groovy, больше допольнительних библиотек итд)


(Mykhailo Poliarush) #8

groovy позволяет использовать все что есть в java

на груви даже множно писать код, точно такой же как в джава и он будет без проблем работать

просто в некоторых моментах, когда ты хочешь использовать syntax sugar ты можешь его без проблем использовать

а все java библиотеки из груви доступны


(Taras) #9

Ок, не будем спорить, я наверное просто не евангелист язиков типа Groovy ))


(Mykhailo Poliarush) #10

ок, евангелистом и не надо быть

просто надо знать что такие возможности у языка есть

я вообще считаю, что нет одного супер языка программирования

надо иметь в своем арсенале несколько, тогда работать и автоматизировать проще


(Максим Таран) #11

В JavaDocs написано, что вместо StringTokenizer лучше использовать String.split(). Работа в groovy с xml, да и строками попроще будет.


(Максим Таран) #12

Это точно! :)


(Максим Таран) #13

А можно ещё сделать финт ушами :) В responce добавить параметры как-то так:

...

<entityType>бла бла</entityType>

<fieldList>

${paramname}

</fieldList>

...

И в скрипте этот параметр заполнять в качестве строки, которой вам надо. Должно сработать.


(tisaser) #14

Да, это сработает, но только для предопределенного количества нод fieldList. Если количество каждый раз разное, то либо 

def lst = ["value1", "value2"]

def strRequest

lst.each{

//конкатенация строки с нодами

}

либо

строить нормальную Xml и печатать ее в стринг ч/з XmlNodePrint.


(Максим Таран) #15

Ну, нужное количество возвращать из скрипта как раз. :)


(tisaser) #16

Так а как это нужное количество субнодов <fieldName> в SoapUI request-е добавить?

Либо создавать кусок XML как String либо как XML а потом печатать в String. Можно еще конечно на лету перед отправкой реквеста его править, но это имхо перебор.


(Максим Таран) #17

Ну да. Как String. :)


(Евгений_Л) #18

Добрый день , еще раз!! 

Всем огромное спасибо за советы!! Но дело в том, что при "подсовывании" с помощю скипта следующего стринга:

....

 

<field>бла бла бла</field>

<field>бла бла бла</field>

<field>бла бла бла</field>

<field>бла бла бла </field>

<field>бла бла бла</field>

<field>бла бла бла</field>

<field>бла бла бла</field>

 

...

 

Соап превращает знаки  <  и  > в  &lt;  и &gt; соответственно!! 

Получается:

 &lt;бла бла бла&gt;

 &lt;бла бла бла&gt;

 &lt;бла бла бла&gt;

 &lt;бла бла бла&gt;

Как отучить Соап от этой глупой привычки ))) ?? 

Заранее благодарен.

 

 


(Mykhailo Poliarush) #19

ну раз у вас проблемы с encoding, то показывайте код, как вы "подсовываете" теги?