2017-10-18 154 views
3

我有一個SOAP請求,它具有隨機方法生成的動態值。如何捕獲這些生成的值以記錄?肥皂ui請求內容的動態值

我的SOAP請求:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET/"> 
    <soap:Header/> 
    <soap:Body> 
     <web:ChangeLengthUnit> 
     <web:LengthValue>${=(int)(Math.random()*9999)}</web:LengthValue> 
     <web:fromLengthUnit>Inches</web:fromLengthUnit> 
     <web:toLengthUnit>Centimeters</web:toLengthUnit> 
     </web:ChangeLengthUnit> 
    </soap:Body> 
</soap:Envelope> 

Groovy腳本:

import com.eviware.soapui.support.GroovyUtils; 
def prj = testRunner.testCase.testSuite.project.workspace.getProjectByName("Project1") 
tCase = prj.testSuites['TestSuite'].testCases['TestCase'] 
tStep = tCase.getTestStepByName("ChangeLengthUnit") 

def stepReq = tStep.getProperty("Request").getValue() 

def runner = tStep.run(testRunner, context) 
log.info ("runner status ....... : " + runner.hasResponse()) 
log.info stepReq 
for(assertion in tStep.assertionList) 
{ 
log.info "Assertion [" + assertion.label + "] has status [" + assertion.status + "]" 
for(e in assertion.errors) 
log.info "-> Error [" + e.message + "]" 
} 
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) 
def holder = groovyUtils.getXmlHolder(stepReq.toString()) 

log.info holder.getNodeValues("//web:LengthValue").toString() 

以上常規腳本如下給人輸出:

Wed Oct 18 14:55:13 SGT 2017:INFO:[${=(int)(Math.random()*9999)}] 

LengthValue標籤的實際值= 3 490,如何獲取此值?

+0

請勿使用'workspace',因爲它無法運行side soapui,即如果使用testrunner執行項目,它將失敗。 – Rao

回答

2

我想你正在做的是從請求'模板'獲取LengthValue,而不是SoapUI實際傳遞給Web服務的東西。

在你的榜樣,你有...

def stepReq = tStep.getProperty("Request").getValue() 

的要求是什麼,你在看到了SoapUI包括您的增值經銷商,例如$ {myVar的}。我認爲你所追求的是'原始要求'。

在SoapUI中,運行請求,運行後,您應該看到標有「原始請求」的選項卡。這是SoapUI實際發送到Web服務的內容,在這裏你會看到已經評估過的變量,並顯示出值,這就是你所追求的。

我已經採取了你的例子,並做了一些mods它。我沒有測試過它,但它應該可以幫助你。

import com.eviware.soapui.support.GroovyUtils; 
def prj = testRunner.testCase.testSuite.project.workspace.getProjectByName("Project1") 
tCase = prj.testSuites['TestSuite'].testCases['TestCase'] 
tStep = tCase.getTestStepByName("ChangeLengthUnit") 

def stepReq = tStep.getProperty("Request").getValue() 

def runner = tStep.run(testRunner, context) 

// CHA MOD - Can only get raw request after running the step. 
def rawRequest = context.expand('${ChangeLengthUnit#RawRequest}') 
//CHA MOD - Quick look at the rawRequest... 
log.info(rawRequest); 


log.info ("runner status ....... : " + runner.hasResponse()) 
log.info stepReq 
for(assertion in tStep.assertionList) 
{ 
log.info "Assertion [" + assertion.label + "] has status [" + assertion.status + "]" 
for(e in assertion.errors) 
log.info "-> Error [" + e.message + "]" 
} 
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) 
def holder = groovyUtils.getXmlHolder(stepReq.toString()) 

log.info holder.getNodeValues("//web:LengthValue").toString() 

//CHA MOD - Get the length from the raw request... 
holder = groovyUtils.getXmlHolder(rawRequest.toString()) 
log.info holder.getNodeValues("//web:LengthValue").toString() 
1

您從實際請求中獲得價值。嘗試從RawRequest獲得

使用下面的代碼

def holder = groovyUtils.getXmlHolder(mentionThenameofthestep#RawRequest) 

上面的代碼將指向您一步步測試的原始請求包含執行,而不是「$過程中傳遞的實際值的數據{=(INT)(數學.random()* 9999)}「

2

它可以很容易地從RawRequest使用Script Assertion讀取相同的請求步驟。

assert context.rawRequest, 'Request is empty or null' 

def xml = new XmlSlurper().parseText(context.rawRequest) 
def actualValueInTheRequest = xml.'**'.find{it.name() == 'LengthValue'}?.text() 
log.info "Value for LengthValue in the actual request is : $actualValueInTheRequest"