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

SoapUI如何通过Groovy脚本更新WSDL定义和重新创建请求

申屠森
2023-03-14

我在SoapUI中有一个肥皂测试项目。我已经将所有请求作为测试步骤添加到测试套件中。

每次开始测试时,我需要更新WSDL定义并重新创建请求(同时保留现有值)。

我需要一个groovy脚本的帮助来自动完成这个过程,这个脚本可以放在项目内部,每次在执行开始之前运行。

共有3个答案

濮阳品
2023-03-14

如果您手头有一个更新的wsdl文件,那么您可以使用UpdateWSDLDefinition.groovy脚本来更新服务接口

/**
*This script automatically update the wsdl definition and its test requests in the soapui project
*Check for the variables- projectName, wsdlFiles to be updated before running the script
*/
import com.eviware.soapui.impl.wsdl.WsdlInterface
import com.eviware.soapui.impl.wsdl.WsdlProject
import com.eviware.soapui.model.iface.Interface
import static com.eviware.soapui.impl.wsdl.actions.iface.UpdateInterfaceAction.recreateRequests
import static com.eviware.soapui.impl.wsdl.actions.iface.UpdateInterfaceAction.recreateTestRequests
/**
* Created by nmrao on 12/24/14.
*/
class UpdateWsdls {

       WsdlProject wsdlProject

        public UpdateWsdls(String projectFileName) {
            this.wsdlProject = new WsdlProject(projectFileName)
        }

        def getBindingNames(String wsdlFile) {
            def definitions = new XmlParser().parse(new File(wsdlFile))
            return definitions.getByName('*:binding').@name
        }

        void updateInterfaceDefinitions(List<String> wsdlFileNames) {
            wsdlFileNames.each { fileName ->
                def interfaceNames = getBindingNames(fileName)
                interfaceNames.each {
                    updateInterfaceDefinition(it, fileName)
                }
            }       
        }

        void updateInterfaceDefinition(String interfaceName, String fileName) {       
            List<Interface> interfacesList = wsdlProject.interfaceList
            interfacesList.each { Interface anInterface ->
                if (anInterface instanceof WsdlInterface && interfaceName.equals(anInterface.name)) {
                    WsdlInterface wsdlInterface = (WsdlInterface) anInterface
                    wsdlInterface.updateDefinition(fileName, false)
                }
            }
        }

        void updateRequests () {
            List<Interface> interfacesList = wsdlProject.interfaceList
            interfacesList.each { Interface anInterface ->
                WsdlInterface wsdlInterface = (WsdlInterface) anInterface
                recreateRequests(wsdlInterface,false,false,true,false)
                recreateTestRequests(wsdlInterface,false,false,true,false)
            }
        }

        void saveWsdlProject() {
            wsdlProject.save()
            wsdlProject.release()

        }

}

String projectName = "/path/to/abc-soapui-project.xml" //absolute path of soapui project file
List<String> wsdlFiles = ["/path/to/service1.wsdl"] //or you can have multiple wsdls from different wsdl files which you want to update in one project
UpdateWsdls updateWsdl = new UpdateWsdls(projectName)
updateWsdl.updateInterfaceDefinitions(wsdlFiles)
updateWsdl.updateRequests()
updateWsdl.saveWsdlProject()
姬正文
2023-03-14

我有办法通过goovy脚本更新定义。下面的脚本将更新wsdl定义。现在我需要一个脚本来根据更新的架构重新创建我的所有请求。

import com.eviware.soapui.impl.wsdl.WsdlInterface

myInterface=(WsdlInterface) testRunner.testCase.testSuite.project.getInterfaceByName("interface name");

myInterface.updateDefinition("wsdl url here", false);

log.info " WSDL definition loaded from '" + myInterface.getDefinition() + "'";

==============================================================

现在需要一个脚本来基于更新的架构重新创建所有请求(保留现有值)

利思源
2023-03-14

现在让它工作了..这是完整的代码

import static com.eviware.soapui.impl.wsdl.actions.iface.UpdateInterfaceAction.recreateRequests
import static com.eviware.soapui.impl.wsdl.actions.iface.UpdateInterfaceAction.recreateTestRequests

project = testRunner.testCase.testSuite.project; //get the project reference
def ifaceList = project.getInterfaceList(); //get all the interfaces present in the project in a list

//start a loop for number of interfaces
for(int i = 0; i < project.getInterfaceCount() ; i++)
{

def iface = project.getInterfaceAt(i);
def url = iface.definition;
iface.updateDefinition( url, true); //updateDefinition(String url , Boolean createRequests)

//The above part updates the definition
//The part below recreates the requests based on updated wsdl definition

//syntax - 
//recreateRequests( WsdlInterface iface, boolean buildOptional, boolean createBackups, boolean keepExisting, boolean keepHeaders )

recreateRequests(iface,true,true,true,true);
recreateTestRequests(iface,true,true,true,true);
}
//End of Script//

希望这有助于其他人寻找类似的解决方案。

 类似资料:
  • 我使用Soap用户界面来测试我的网络服务。每次我想执行我的测试请求时,我都需要更新定义。我知道有可能添加Groovy脚本来让WSDL自动更新。但是我不知道我应该添加这个脚本来使它工作。有人能描述一下我每次执行请求时需要做的使这个脚本运行的步骤吗?

  • 我试图使用groovy脚本创建Soapui项目。当直接从SoapUI运行它时,脚本工作正常,并且创建了使用WSDL的新项目。 该脚本是在:Project->TestSuite->TestCase->Groovy脚本中创建的 脚本在中正常工作。但是,在使用运行时失败,如下所示: 错误:java.lang.NullPointerException:无法对空对象调用方法createProject()

  • 我正在尝试编写一个时髦的脚本来更新 SoapUI 请求的某些 CDATA 部分。 我对SoapUI和groovy都是新手。 我已经成功地通过使用属性转移完成了我需要的事情,但是,由于我需要在几乎所有测试用例中执行相同的处理,因此我宁愿在可以从任何需要的地方调用的脚本中执行此操作。 我试图模仿groovy中的属性转移步骤,但是没有成功,因为我似乎无法访问和解析CDATA部分。 任何关于如何使用gro

  • 当我尝试在soapUI测试步骤中解析响应时,收到了以下异常。也尝试了getXMLHolder方法。还是没运气。 答复如下

  • 我想在groovy脚本中定义一个类,我可以通过SoapUI中的其他groovy脚本重用该类。 我一直试图在TestSuite属性中定义我的类,但没有成功。我希望避免在JAR中定义类,因为我们在团队中工作,每个人都必须在他们的SoapUI中导入JAR才能运行我的测试。我使用SoapUI 3.6.1 以下是我的TestSuite的制作方式: 为了简化me测试,我在“Test1”中定义了一个类,我想在“

  • 我有一个具有多个操作的WSDL。对于每个操作,我想要一个模板. xml及其响应和请求。 我知道如何在soapUI中手动执行此操作,但我想使用Groovy脚本生成它们。我已经谷歌了很多,但似乎我是唯一一个正在寻找这个的人。 我的服务有16个操作,所以做这本手册会花费太多时间。由于服务每2个月更新一次,所以使用测试步骤的自动化将是完美的。 我已经为这些请求做到了: 右键单击左树中的“服务”、“生成测试