2014-09-25 2 views
0

Я хочу обновить значения параметра WsdlRequest во время выполнения, используя groovy. Скажем, у меня есть WsdlRequest, который содержит два параметра: имя, адрес. Я хотел бы передать этому WsdlRequest значения, которые я хотел бы запросить, до создания экземпляра WsdlSubmit. Я знаю, что базовый код:Обновление значения WsdlRequest через SoapUI Pro

WsdlProject project = new WsdlProject() 
WsdlInterface iface = WsdlInterfaceFactory.importWsdl(project, wsdl, true)[0] 
WsdlOperation operation = (WsdlOperation) iface.getOperationAt(3) 
WsdlRequest request = operation.addNewRequest(requestName) 
request.setRequestContent (requestContent); 

RequestContent - это soapxml в формате String. Есть ли хороший способ вставить мои значения (например, я хочу, чтобы значение имени было «Test» и значение адреса было «Example» для запроса)? Я бы предпочел не хранить xml в виде строки и обновить это, если у меня уже есть эта информация при генерации запроса.

Вот пример XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:data="http://test.com"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <data:updateFieldName> 
     <fieldId>?</fieldId> 
     <!--Optional:--> 
     <newFieldId>?</newFieldId> 
     </data:updateFieldName> 
    </soapenv:Body> 
</soapenv:Envelope> 

До создания WsdlRequest, я создал заводной объект, который содержит значения, которые я хочу, чтобы заполнить в вышеприведенном сообщении мыло XML. Предположим, что этот объект указывает fieldId = 10 и newFieldRequest = 15. Я не уверен, как передать эти значения в запрос. Есть ли способ сделать это с помощью API SoapUI? У меня также есть лицензия pro.

+0

вы хотите добавить определенные значения в некоторых из XML-узлов делать? Можете ли вы поделиться своим xml и объяснить, в каких узлах вам нужны эти значения? – albciff

+0

Да, я могу это сделать абсолютно. позвольте мне сейчас обновить свой вопрос. Спасибо! – strangenewstar

ответ

2

Вы можете использовать XMLHolder разобрать ваш XML, и вы можете использовать setNodeValue(xpath, value) указать значение для данного узла, в вашем случае это выглядит следующим образом:

import com.eviware.soapui.support.XmlHolder 

// your request content 
def requestContent = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:data="http://test.com">'+ 
    '<soapenv:Header/>'+ 
    '<soapenv:Body>'+ 
     '<data:updateFieldName>'+ 
     '<fieldId>?</fieldId>'+ 
     '<newFieldId>?</newFieldId>'+ 
     '</data:updateFieldName>'+ 
    '</soapenv:Body>'+ 
'</soapenv:Envelope>' 

// parse it as xml bean 
def requestXml = new XmlHolder(requestContent) 
// set your node values 
requestXml.setNodeValue("//*:fieldId","10"); 
requestXml.setNodeValue("//*:newFieldId","15"); 

Затем, чтобы получить содержимое XML как string вы снова можете использовать getXml() метод следующим образом:

WsdlRequest request = ... 
// to set in your request use getXml() 
request.setRequestContent (requestXml.getXml()); 

Для получения дополнительной информации вы посмотрите на XMLHolder api documentation

можете

Существует также другой способ сделать это без groovy script; используя свойства. Вы можете добавить свойства, например, в вашем TestCase, а затем использовать его непосредственно в TestStep запроса, как это:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:data="http://test.com"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <data:updateFieldName> 
     <fieldId>${#TestCase#yourProperty}</fieldId> 
     <newFieldId>${#TestCase#anotherProperty}</newFieldId> 
     </data:updateFieldName> 
    </soapenv:Body> 
</soapenv:Envelope> 

взглянуть Если вы заинтересованы в этом: Working with properties и property expansion

EDIT на основе ON COMMENT:

Я пишу целый пример с кодом и держатель XML с использованием открытого wsdl из-за вы можете попробовать и получить результат без NPE и сравнить с вашими, чтобы проверить, что происходит:

import com.eviware.soapui.impl.wsdl.WsdlProject 
import com.eviware.soapui.impl.wsdl.WsdlInterface 
import com.eviware.soapui.impl.WsdlInterfaceFactory 
import com.eviware.soapui.impl.wsdl.WsdlOperation 
import com.eviware.soapui.impl.wsdl.WsdlRequest 
import com.eviware.soapui.support.XmlHolder 

wsdl = "http://www.webservicex.net/geoipservice.asmx?WSDL" 
WsdlProject project = new WsdlProject() 
WsdlInterface iface = WsdlInterfaceFactory.importWsdl(project, wsdl, true)[0] 
WsdlOperation operation = (WsdlOperation) iface.getOperationByName("GetGeoIP") 
WsdlRequest request = operation.addNewRequest("Request") 
def defaultRequest = operation.createRequest(true) 
def xmlHolder = new XmlHolder(defaultRequest) 
xmlHolder.setNodeValue("//*:IPAddress","127.0.0.1"); 
request.setRequestContent (xmlHolder.getXml()); 

Надеется, что это помогает,

+0

большое спасибо. Я попробую. Я согласен с тем, что я должен перейти к использованию менталитета TestSuite/TestCase/TestStep, и это так PoC. Большая часть документации SoapUI, по-видимому, относится к пользователям графического интерфейса пользователя, что важно, но не там, где я хочу возглавить этот проект. Я также не думал использовать свойство TestCase для TestStep. спасибо за вход! Я вижу API GroovyUtils, и я думал, что мне нужно будет использовать его для тестирования на TestStep. – strangenewstar

+0

am Могу ли я использовать def requestContent = operation.createRequest (true), чтобы получить значение для передачи в request.setRequestContent (requestContent)? Я получаю NullPointer. Я согласен с ответом, я пытаюсь заставить его работать, но я знаю, что вы правы :) – strangenewstar

+0

Я также попытался жестко закодировать строку, как и вы, и я все еще получаю nullpointer ... пытаясь определить, что я сделал неправильно – strangenewstar

0

Ниже заводной сценарий для следующего:

  1. Обновить все WSDL Определение в проекте.
  2. Восстановить все запросы к обновленным.
  3. Делает резервную копию старых запросов.

import static com.eviware.soapui.impl.wsdl.actions.iface.UpdateInterfaceAction.recreateRequests 
    import static com.eviware.soapui.impl.wsdl.actions.iface.UpdateInterfaceAction.recreateTestRequests 

    project = testRunner.testCase.testSuite.project; //get the project reference 
    def ifaceList = project.getInterfaceList(); //get all the interfaces present in the project in a list 

    //start a loop for number of interfaces 
    for(int i = 0; i < project.getInterfaceCount() ; i++) 
    { 

    def iface = project.getInterfaceAt(i); 
    def url = iface.definition; 
    iface.updateDefinition(url, true); //updateDefinition(String url , Boolean createRequests) 

    //The above part updates the definition 
    //The part below recreates the requests based on updated wsdl definition 

    //syntax - 
    //recreateRequests(WsdlInterface iface, boolean buildOptional, boolean createBackups, boolean keepExisting, boolean keepHeaders) 

    recreateRequests(iface,true,true,true,true); 
    recreateTestRequests(iface,true,true,true,true); 
    } 
    //End of Script// 
Смежные вопросы