在Load Script中更改请求XML

时间:2017-03-29 11:17:24

标签: soapui

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

我想我可以轻松地为我注册一些Listener的项目编写一个“加载脚本”,每次添加新请求时,脚本都会从新的请求对象中获取xml请求,更改并保存回来了。但我失败了,因为我不知道如何从请求中获取xml。

这是我得到了多远:

GtkWidget *image = gtk_image_new_from_file ("...");
GtkWidget *button = gtk_button_new ();

gtk_button_set_image (GTK_BUTTON (button), image);

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

有人可以帮助我吗?

编辑:

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

2 个答案:

答案 0 :(得分:1)

无法以requestAdded()方式访问请求,也无法按用户分配请求。

在调试SoapUI代码后学习,无法在接口requestAdded的{​​{1}}方法的实现中读取请求。

用户点击InterfaceListener后会立即触发

requestAdded()方法,此时请求内容为空/ null

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

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

答案 1 :(得分:0)

由于help and effort from Rao(再次感谢),我做了以下工作:

  • 在加载脚本中为新请求注册侦听器
  • 关于请求创建,将interface-和request-name作为自定义属性写入项目(在我的情况下,operation-name始终是相同的)
  • 习惯是使用我之后运行的特殊测试用例
  • 完成的

项目的加载脚本:

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", "")