当前位置: 首页 > 知识库问答 >
问题:

使用Groovy脚本,如何以数据驱动的方式访问存储在MessageExchange中的动态soap请求?

包阳成
2023-03-14

我正在尝试一个数据驱动的方法,在肥皂用户界面使用Groovy脚本,我想导出每个动态请求和响应从MessageExchange到Excel工作表。我使用输入数据Excel文件“dataFile.xls”进行简单的“登录”操作。它由2个字段用户名和密码与4条记录。我的脚本正在做一个数据驱动的方法,并执行Excel文件中的所有记录。但是我想将所有四个动态请求和响应导出到Excel文件“Output.xls”中。我的肥皂包有两个Groovy测试请求(一个用于数据驱动程序,另一个用于循环),一个属性测试步骤用于保存输入元素属性和临时变量,一个肥皂测试请求“登录”。下面是我在“数据驱动程序”Groovy测试步骤中使用的代码片段。

// IMPORT THE LIBRARIES WE NEED

import com.eviware.soapui.support.XmlHolder 
import jxl.* 
import jxl.write.*
import com.eviware.soapui.model.iface.MessageExchange


// DECLARE THE VARIABLES

def myTestCase = context.testCase //myTestCase contains the test case 
log.info(myTestCase)
def counter,next,previous,size //Variables used to handle the loop and to move inside the file 
Workbook workbook1 = Workbook.getWorkbook(new File("d:\\Groovy videos\\dataFile.xls")) //file containing the data 
Sheet sheet1 = workbook1.getSheet(0) //save the first sheet in sheet1 
size = sheet1.getRows().toInteger() //get the number of rows, each row is a data set 
log.info(size)
propTestStep = myTestCase.getTestStepByName("Property - Looper") // get the Property TestStep object 
log.info(propTestStep)
req = myTestCase.getTestStepByName("login").getProperty("Request").getValue() 
//log.info(req)

propTestStep.setPropertyValue("Total", size.toString())
counter = propTestStep.getPropertyValue("Count").toString() //counter variable contains iteration number 
counter = counter.toInteger() // 
next = (counter > size-2? 0: counter+1) //set the next value 

// OBTAINING THE DATA YOU NEED

Cell u = sheet1.getCell(0,counter) // getCell(column,row) //obtains user 
Cell p = sheet1.getCell(1,counter) // obtains password 
workbook1.close() //close the file

////////////////////////////////////

usr = u.getContents() 
pass = p.getContents() 
propTestStep.setPropertyValue("user", usr) //the value is saved in the property 
propTestStep.setPropertyValue("pass", pass) //the value is saved in the property 
propTestStep.setPropertyValue("Count", next.toString()) //increase Count value 
next++ //increase next value 
propTestStep.setPropertyValue("Next", next.toString()) //set Next value on the properties step

WritableWorkbook workbook2 = Workbook.createWorkbook(new File("d:\\output.xls"))
WritableSheet sheet2 = workbook2.createSheet("Request", 0)
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) 
def temp=testRunner.testCase.testSteps["login"]

def testStepContext = new com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext(temp)
def reqq = testStepContext.getRequestContent()
log.info(reqq)
//def temp=testRunner.testCase.testSteps.testRequest.getRequestContent()
//holder = groovyUtils.getXmlHolder(messageExchange.requestContent)
log.info("request : "+temp)
Label label1 = new Label(0, 6, temp);
sheet2.addCell(label1);
workbook2.write()
workbook2.close()

//Decide if the test has to be run again or not 
if (counter == size-1) 
{ 
    propTestStep.setPropertyValue("StopLoop", "T") 
    log.info "Setting the stoploop property now..." 
} 
else if (counter==0) 
{ 
    def runner = new com.eviware.soapui.impl.wsdl.testcase.WsdlTestCaseRunner(testRunner.testCase, null) 
    propTestStep.setPropertyValue("StopLoop", "F")
} 
else 
{ 
    propTestStep.setPropertyValue("StopLoop", "F") 
}

我得到的错误groovy.lang.Mis的方法异常:没有签名的方法:com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext.get请求内容()适用于参数类型:()值:[]错误行:50"

有人可以帮我吗?主要目标是从 MessageExchange 获取所有动态请求和响应,并将所有数据导出到 excel 工作表中。

共有2个答案

晏阳飙
2023-03-14

您最好利用项目级别事件“TestRunListener.afterStep”来完成您的任务。

在这种情况下,您将可以访问testRunner,上下文

肥皂服务:

if (context.getCurrentStep() instanceof WsdlTestRequestStep) {
    WsdlTestStepResult soapResult= (WsdlTestStepResult) testStepResult;
    log.info "Request: "+soapResult.getRequestContent();
    log.info "Response: "+soapResult.getResponseContent();
}

对于Rest服务:

if (context.getCurrentStep() instanceof RestTestRequestStep) {
    RestRequestStepResult restResult= (RestRequestStepResult) testStepResult;
    log.info "Request: "+restResult.getRequestContent();
    log.info "Response: "+restResult.getResponseContent();
}
隗瑞
2023-03-14

您的程序在那里抛出异常:

def testStepContext = new com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext(temp)
def reqq = testStepContext.getRequestContent()
log.info(reqq)

例外非常清楚MissingMethodException,所以问题是com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext没有getRequestContent()方法

总之,在您的代码中,您只在< code>log.info(reqq)上使用< code>reqq...那么不用分析整个代码,解决问题的简单方法就是删除这几行,因为它们没有用。

 类似资料:
  • 我正在编写一个Groovy脚本来使用SOAP Web服务。首先,我在SOAP中导入了我的WSDL并创建了一个项目。 那么所有的SOAP请求都会自动生成。 现在我尝试编写一个Groovy来使用生成的SOAP请求调用SOAP服务。 现在这是我的时髦脚本 我想访问在SOAPUI-CreateNote中生成的相同SOAP请求。我如何访问它? 我的实际需求是访问Groovy脚本中的所有SOAP请求——这样我

  • 我是Groovy脚本新手。 要求从文本文件中读取请求值并将其传递给肥皂请求xml并保存输出。 面临的问题:我无法读取步骤1到步骤2的数据。然而,我也在设置上下文变量中的值。请帮助我解决此问题,以便我能够自动化整个过程。 注意:我们只能访问SOAPUI,不能访问SOAPUI Pro 步骤1: 第2步: 步骤3:

  • 我正在使用jenkins和Jobdsl创建jenkins的工作。我试图通过在active choice参数中添加一个groovy脚本来构建一个参数化作业。脚本使用存储在jenkins凭据中的凭据,我正试图通过使用代码在脚本中获取它

  • 我从项目中的脚本执行一个脚本。 该脚本中还有另一个循环,即执行请求。之后,应该执行另外两个脚本来处理输出。这些在请求步骤之后的相同testcase中,但不会自动执行。

  • 我正在编写一个时髦的脚本,以在一个步骤中测试我的所有服务。 我导入了WSDL,然后自动生成所有SOAP请求。 我希望减少逐个测试所有SOAP服务的手动工作。 所以,如果可能的话,我想通过groovy实现。 从addressScript中的这里——我想在以后的所有测试用例中访问所有的SOAP请求。那么有没有可能通过上下文中的一些循环来实现它呢..?下面是我正在尝试的示例代码。 我的主要座右铭是减少逐