在加载脚本中更改请求 XML

Changing the request XML in Load Script

我有一个大型 IT 系统的 soapui 项目,它提供了数百个 Web 服务,我的项目中只有一些 Web 服务。每次我向我的项目添加一个新的 WSDL 时,我都必须做大量的猴子工作来调整请求的 xml(比如为属性添加占位符、删除注释、替换问号....)。

我想我可以很容易地为我注册了一些监听器的项目编写一个 "Load Script",并且每次添加一个新请求时脚本都会从新请求中获取 xml-request -对象,更改它并保存回来。但是我失败了,因为我不知道如何从请求中获取 xml。

这是我的进展:

import com.eviware.soapui.SoapUI
import com.eviware.soapui.model.support.ProjectListenerAdapter
import com.eviware.soapui.model.support.InterfaceListenerAdapter
import com.eviware.soapui.model.iface.*
import com.eviware.soapui.impl.wsdl.WsdlRequest
import com.eviware.soapui.impl.wsdl.WsdlContentPart
import com.eviware.soapui.model.propertyexpansion.DefaultPropertyExpansionContext
import com.eviware.soapui.support.XmlHolder

final logger = log
SoapUI.log.info("Load Script executet")
for(Interface i : project.getInterfaceList()){
    i.addInterfaceListener(new RequestAddListener())
}

project.addProjectListener(new ProjectListenerAdapter(){
    public void interfaceAdded(Interface i){
        SoapUI.log.info("Interface added: "+ i.getName())
        i.addInterfaceListener(new RequestAddListener())
    }
})

public class RequestAddListener extends InterfaceListenerAdapter {
    public void requestAdded(Request r) {
        if(r instanceof WsdlRequest){
            WsdlRequest request = (WsdlRequest) r
            SoapUI.log.info("Request added: "+request.getName())
            // here i want to retrieve the xml-request from the request-object, 
            // do something with it, and set it back to the request-object.
        }
    }
}

我查看了 WsdlRequest-Instance 的每个 属性,但找不到任何 XML。我试图创建一个上下文(加载脚本不提供上下文实例)并以某种方式从中获取 XmlHolder,但失败了(意外元素:CDATA)。我找到的所有示例,其中 运行 在 TestCase/Step 中,我无法将它们传输到项目的加载脚本中。

有人可以帮助我吗?

编辑:

我想把新请求(图中4)的request-data改成上面的例子(图中3)。我想,我可以通过使用项目的加载脚本来解决它(图中的2.)。我的方法是在每个接口中注册一个 InterfaceListener 并对新请求的创建做出反应(方法 requestAdded)。这可行,但我没有找到从请求对象检索请求数据的方法。

无法通过requestAdded()方法访问请求,也无法通过用户分配请求。

调试到SoapUI的代码后得知,无法读取接口InterfaceListenerrequestAdded方法实现中的请求。

requestAdded() 方法在用户点击 New Request 时立即触发,此时请求内容为 empty / null.

稍后,SoapUI 将通过创建一个新请求来分配请求,然后将请求显示给用户。

但是,您可以尝试编写一个单独的 groovy 脚本来在创建请求后实现相同的目的。

因为 (再次感谢)我做了以下工作ao运行d:

  • 在加载脚本中为新请求注册侦听器
  • 创建请求时,将接口和请求名称作为自定义属性写入项目(操作名称在我的情况下始终相同)
  • 自定义是用一个特殊的测试用例完成的,我 运行 之后

项目中的加载脚本:

import com.eviware.soapui.model.support.ProjectListenerAdapter
import com.eviware.soapui.model.support.InterfaceListenerAdapter
import com.eviware.soapui.model.iface.*
import com.eviware.soapui.model.project.Project
import com.eviware.soapui.impl.wsdl.WsdlRequest

// Request-Listener for all existing interfaces
for(Interface i : project.getInterfaceList()){
  i.addInterfaceListener(new RequestAddListener())
}

// this Project-Listener adds a Request-Listener to all new Interfaces
project.addProjectListener(new ProjectListenerAdapter(){
  public void interfaceAdded(Interface i){
    i.addInterfaceListener(new RequestAddListener())
  }
})

public class RequestAddListener extends InterfaceListenerAdapter {
  public void requestAdded(Request r) {
    if(r instanceof WsdlRequest){
      Operation o = r.getOperation()
      Interface i = o.getInterface()
      Project p = i.getProject()
      // save name of request and interface as project-property
      p.setPropertyValue("lastAddedRequest.Request", r.getName())
      p.setPropertyValue("lastAddedRequest.Interface", i.getName())
    }
  }
}

我在创建请求后手动 运行 空测试用例的设置脚本:

import com.eviware.soapui.model.iface.*
import com.eviware.soapui.model.testsuite.TestCase
import com.eviware.soapui.model.project.Project


def project = testCase.getProject()
def i = project.getInterfaceByName(project.getPropertyValue("lastAddedRequest.Interface"))
// in my case all operations are named execute
def request = i.getOperationByName("execute").getRequestByName(project.getPropertyValue("lastAddedRequest.Request"))
def requestData = request.getRequestContent()
// change the xml with some regexs

// put the xml back
request.setRequestContent(requestData)
project.setPropertyValue("lastAddedRequest.Interface", "")
project.setPropertyValue("lastAddedRequest.Request", "")