从SoapUI groovy脚本中执行Java jar文件不起作用

时间:2014-08-28 18:32:55

标签: groovy soapui

我是SoapUI和Groovy的新手,所以请原谅这篇文章,因为它已在Stackoverflow中多次发布,但我找不到修复。

SoapUI版本:4.5.2

如果你们不介意,我有2个问题:

  1. 我有一个可执行jar文件,我把它放在\ bin \ ext目录下,还有另一个jar,它被认为是jar中代码中的依赖jar,所以我希望它会在那里引用。我在Stackoverflow中找到的应该执行此jar的Groovy代码如下所示,但是不起作用,因为我在SoapUI目录中的任何地方都看不到任何输出。
  2. 以下是代码:

    def command = "java -jar UpdateAppIdXMLRequest.jar file.xml"
    def process = command.execute()
    process.waitFor()
    
    def output = process.in.text
    log.info output
    
    1. 这个jar创建了25个xml文件,这些文件应该可以被SoapUI选中并将它们作为TestSteps放在同一个项目中。在我的java代码中,我将这些文件放在哪条路径上?
    2. 以下是我的jar中的代码:

      import java.io.File;
      import java.io.FileWriter;
      import java.io.IOException;
      
      import org.jdom2.Document;
      import org.jdom2.Element;
      import org.jdom2.JDOMException;
      import org.jdom2.input.SAXBuilder;
      import org.jdom2.output.Format;
      import org.jdom2.output.XMLOutputter;
      
      class UpdateAppIdXMLRequest {
      
          static main(args) {
      
              try {
      
                SAXBuilder builder = new SAXBuilder();
                File xmlFile = new File("c:\\file.xml");
      
                Document doc = (Document) builder.build(xmlFile);
                Element rootNode = doc.getRootElement();
      
                // Create loop to create 25 testStepApps
                for (int i = 1; i < 26; i++) {
      
                    // Get current AppID, incrementAppID and update the ApplicationNumber attribute value for next test script.
                    int appID = Integer.parseInt(rootNode.getAttributeValue("ApplicationNumber"));
                    appID++;
                    String appIDValue = Integer.toString(appID);
                    rootNode.getAttribute("ApplicationNumber").setValue(appIDValue);
      
                    XMLOutputter xmlOutput = new XMLOutputter();
      
                    // Create new XML file with next AppID
                    xmlOutput.setFormat(Format.getPrettyFormat());
                    xmlOutput.output(doc, new FileWriter("c:\\testStepApp" + i + ".xml"));
      
                    // xmlOutput.output(doc, System.out);
      
                    // System.out.println("File updated!");
                }
              } catch (IOException io) {
                io.printStackTrace();
              } catch (JDOMException e) {
                e.printStackTrace();
              }
          }
      }
      

      任何帮助/指示将不胜感激。

      感谢。

1 个答案:

答案 0 :(得分:2)

为了做到这一点,我建议你直接使用groovy测试步骤而不是jar,这样你就有了更大的灵活性,每次你需要改变时你都没有重新编译jar。

因此,为了实现目标,首先需要在项目中创建TestCase,在此内部创建SOAP Test StepGroovy Test Step

enter image description here

我将使用SOAP Test Step创建其他测试步骤(创建需要wsdl:operation的测试步骤等等,并且复制直接创建的测试步骤更容易。)

Groovy Test Step中,我将提供必要的代码来完成下面显示的工作:

import com.eviware.soapui.support.XmlHolder
import com.eviware.soapui.impl.wsdl.teststeps.registry.WsdlTestRequestStepFactory

// read your request template
def requestFile = new File("C:/file.xml");
// parse it as xml
def requestXml = new XmlHolder(requestFile.text)

// get the current testCase to add testSteps later
def tc = testRunner.testCase;
// get the testStep as template to create the other requests
def tsTemplate = tc.getTestStepByName("Template");

// loop to create 25 testStep
for(int i = 1; i < 26; i++){
    // xpath expression to get applicationNumber attribute in root node
    def xpathNodeAttr = "/*/@ApplicationNumber";

    // get the root node attribute applicationNumber throught an XPATH
    int appId = Integer.parseInt(requestXml.getNodeValue(xpathNodeAttr));
    // add 1 to appId
    appId++;
    // set the value again in the attribute
    requestXml.setNodeValue(xpathNodeAttr,appId);


    def testStepName = "TestStep_ApplicationNumber_"+ String.valueOf(appId)
    log.info testStepName;
    log.info testStepName.getClass().getName()
    log.info tc.getClass().getName()
    // create a new testStepConfig
    def testStepFactory = new WsdlTestRequestStepFactory();
    def testStepConfig = testStepFactory.createConfig( tsTemplate.getOperation(), testStepName )
    // add the new testStep to TestCase
    def newTestStep = tc.insertTestStep( testStepConfig, -1 )
    // set the request which just create
    newTestStep.getTestRequest().setRequestContent(requestXml.getXml())
}

此代码基本上是您的java代码“已翻译”为groovy并添加了创建测试步骤所需的代码。简而言之,此代码从文件中读取请求,并使用请求在当前测试用例中创建25个测试步骤,在每个请求中,它仅更改根节点的ApplicationNumber属性,并将其添加+1。 / p>

基于评论的编辑:

如果您使用REST Request step代替SOAP Request Step,则必须更改您的常规代码,以便在其上使用com.eviware.soapui.impl.wsdl.teststeps.registry.RestRequestStepFactorygetTestRequest()方法。因此,如果您有一个带POST方法的REST服务,请创建Test Case REST Request test stepGroovy Test Step,如下所示:

enter image description here

并使用这个常规代码,基本上这个代码是相同的,并且像上面的代码一样工作,与REST Request而不是SOAP Request做同样的事情:

import com.eviware.soapui.support.XmlHolder
import com.eviware.soapui.impl.wsdl.teststeps.registry.RestRequestStepFactory

// read your request template
def requestFile = new File("C:/file.xml");
// parse it as xml
def requestXml = new XmlHolder(requestFile.text)

// get the current testCase to add testSteps later
def tc = testRunner.testCase;
// get the testStep as template to create the other requests
def tsTemplate = tc.getTestStepByName("Template");

// loop to create 25 testStep
for(int i = 1; i < 26; i++){
    // xpath expression to get applicationNumber attribute in root node
    def xpathNodeAttr = "/*/@ApplicationNumber";

    // get the root node attribute applicationNumber throught an XPATH
    int appId = Integer.parseInt(requestXml.getNodeValue(xpathNodeAttr));
    // add 1 to appId
    appId++;
    // set the value again in the attribute
    requestXml.setNodeValue(xpathNodeAttr,appId);


    def testStepName = "TestStep_ApplicationNumber_"+ String.valueOf(appId)
    log.info testStepName;
    log.info testStepName.getClass().getName()
    log.info tc.getClass().getName()
    // create a new testStepConfig
    def testStepFactory = new RestRequestStepFactory();
    def testStepConfig = testStepFactory.createConfig( tsTemplate.getTestRequest(), testStepName )
    // add the new testStep to TestCase
    def newTestStep = tc.insertTestStep( testStepConfig, -1 )
    // set the request which just create
    newTestStep.getTestRequest().setRequestContent(requestXml.getXml())
}

希望这有帮助。