在加载脚本中更改请求 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的代码后得知,无法读取接口InterfaceListener
的requestAdded
方法实现中的请求。
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", "")
我有一个大型 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的代码后得知,无法读取接口InterfaceListener
的requestAdded
方法实现中的请求。
requestAdded()
方法在用户点击 New Request
时立即触发,此时请求内容为 empty / null.
稍后,SoapUI 将通过创建一个新请求来分配请求,然后将请求显示给用户。
但是,您可以尝试编写一个单独的 groovy 脚本来在创建请求后实现相同的目的。
因为
- 在加载脚本中为新请求注册侦听器
- 创建请求时,将接口和请求名称作为自定义属性写入项目(操作名称在我的情况下始终相同)
- 自定义是用一个特殊的测试用例完成的,我 运行 之后
项目中的加载脚本:
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", "")