我有一个大型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)。这有效,但我没有找到从请求对象中检索请求数据的方法。
答案 0 :(得分:1)
无法以requestAdded()
方式访问请求,也无法按用户分配请求。
在调试SoapUI代码后学习,无法在接口requestAdded
的{{1}}方法的实现中读取请求。
InterfaceListener
后会立即触发 requestAdded()
方法,此时请求内容为空/ null 。
稍后,SoapUI将通过创建新请求来分配请求,然后向用户显示请求。
但是,您可以尝试编写单独的groovy脚本,以便在创建请求后实现相同的目标。
答案 1 :(得分:0)
由于help and effort from Rao(再次感谢),我做了以下工作:
项目的加载脚本:
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", "")