迭代来自属性文件的SOAP请求

时间:2013-06-18 13:05:40

标签: java web-services soap properties configuration

我正在编写一个java插件,我打算用它来测试一些Web服务。这些用于Web服务的SOAP位于属性文件中,并按其所属的WSDL(订阅者,网络,用户等)进行分组。此外,还有一些与每个Web服务相关联的正则表达式来测试响应。

Properties Example

#Web services to be tested and regexes to test responses
 #List of web service groups used (WSDLs)
 webservice.list = SubscriberMgmt,NetworkMgmt

 # < -- SubscriberMgmt -- >
 #getSubscriberDevices
 webservice.subscriber = <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.blah.blah.com"><soapenv:Header/><soapenv:Body><ws:getSubscriberDevices><PhoneNumber></PhoneNumber><LastName></LastName><MACAddress></MACAddress><ExternalId></ExternalId><AccountExternalId>john</AccountExternalId><IPAddress></IPAddress></ws:getSubscriberDevices></soapenv:Body></soapenv:Envelope>
 webservice.SubscriberMgmt.regex = subscriberId="(.+?)"
 webservice.SubscriberMgmt.regex.1 = externalId="(.+?)"

 #getMpegResultsById
 webservice.subscriber.1 = <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.blah.blah.com"><soapenv:Header/><soapenv:Body><ws:getMpegResultsById><SubscriberId>100016</SubscriberId><Duration>2880</Duration></ws:getMpegResultsById></soapenv:Body></soapenv:Envelope> 
 webservice.SubscriberMgmt.1.regex = id="(.+?)"
 webservice.SubscriberMgmt.1.regex.1 = externalId="(.+?)"

我目前有代码使用属性文件中的每个WSDL进行连接,所以当'webservicegroup'变量是SubscriberMgmt时,我想测试.subscriber Web服务并检查响应是否包含相应的正则表达式。 ('data'变量仅对应于属性文件中的一个SOAP请求)

//Soap Request
        try
        {
            for(String webservicegroup : webserviceList)
            {
                URL url = new URL("http://" + server + "/webservices/" + webservicegroup);
                URLConnection conn = url.openConnection();
                conn.setDoOutput(true);
                conn.setRequestProperty("Content-type", "text/xml; charset=utf-8");
                conn.setRequestProperty("SOAPAction", "\"\"");
                String loginEnc = new BASE64Encoder().encodeBuffer((username + ":" + password).getBytes());
                loginEnc = loginEnc.replaceAll("\n", "");
                conn.setRequestProperty("Authorization", "Basic " + loginEnc);
                conn.setConnectTimeout(timeout);
                conn.setReadTimeout(timeout);

                OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

                //Send request
                wr.write(data);
                wr.flush();
                wr.close();
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

                //Save response
                String line;

                while ((line = in.readLine()) != null)
                {
                    response += line;
                }
                in.close();
            }
        }

有关最佳方法的任何想法吗?非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

假设您的连接和POST / GET代码正常工作:

第1步:以字符串形式获取整个响应:

String response = new String(ByteStreams.toByteArray(inputStream), "UTF-8");

在上面的代码行中,ByteStreams类是google的guava库的一部分。如果您愿意,可以在apache commons-io中找到类似的代码。

第2步:测试正则表达式:

if( response.matches(regex) ) { ... }

答案 1 :(得分:1)

不要重新发明轮子,从头开始构建自定义测试软件迷你帝国。 使用SOAPUI开源版本来测试Web服务。它允许您:

  • 从Web服务端点WSDL生成SOAP测试,节省手工劳动
  • 避免处理“预先封装的”SOAP字符串和解析文件
  • 自动生成服务端点的模拟,包括以编程方式控制自定义响应的功能。
  • 实现测试步骤逻辑,包括循环,分支,调用其他测试步骤,运行脚本,以及从/向属性文件和数据源读取/写入参数(尽管您必须以编程方式导航和修改XmlHolder实例,如果您希望“数据驱动”你的测试)
  • 执行SOAP,REST,安全性和加载Web服务测试,以及JDBC和HTTP测试调用。
  • 与用于测试自动化(TDD和连续交付)的通用构建和持续集成工具集成。
  • 通过插件在IDE中使用SOAPUI操作。

它被认为是测试Web服务的相当标准的“最佳实践”。

使用SOAPUI的开源版本检查SOAP响应消息的有效内容:

  • 您可以使用XPath or XQuery expressions to validate the XML
  • 您可以使用script assertions

    E.g。如果你的SOAP响应是:

     <soap:Body>
         <GetEnumResponse xmlns="http://www.xyz.com/">
             <GetEnumResult>
                 <ErrorCode>0</ErrorCode>
                 <StatusId>0</StatusId>
             </GetEnumResult>
             <enumsInformation>
                 <EnumInformation>
                     <TransactionId>0</TransactionId>
                     <ConstraintId>5000006</ConstraintId>
                     <EnumValue>xyz</EnumValue>
                     <Index>10</Index>
                 </EnumInformation>
             </enumsInformation>
         </GetEnumResponse>
     </soap:Body>
    

    你可以编写脚本:

     import com.eviware.soapui.support.XmlHolder
     def holder = new XmlHolder(messageExchange.responseContentAsXml)
    
     holder.namespaces["tal"]="http://www.xyz.com/"
     def node = holder.getNodeValue("//tal:ConstraintId[1]");
     log.info(node);
     assert node == "5000006";
    
  • 您甚至可以使用标准java正则表达式处理的最大功率。

    创建执行正则表达式处理的java类,并将它们放入jar文件中,并按照here的说明放在soapUIinstallation / bin / ext中。

    或者将您的SOAPUI测试包装在JUnit测试方法中,并在结尾添加标准Java代码以检查正则表达式。这也简化了测试自动化和允许执行任何非Web服务测试。此方法适用于SOAPUI开源版本,而使用SOAPUI断言步骤的替代方法需要Pro版本。

    步骤:

    1. 如果您选择,请在IDE中安装SOAPUI插件
    2. 使用SOAPUI创建测试套件
    3. 使用SOAPUI在测试套件中创建测试用例
    4. 使用SOAPUI在测试套件中创建测试步骤。这是使用SOAPUI的核心。
    5. 在IDE中创建Java项目。在此项目中,添加一个JUnit测试用例。
    6. 将SoapUI bin和lib目录中的所有JAR添加到Java Build Path。
    7. 在Junit测试用例中,添加代码以执行SOAPUI测试步骤
    8. 获取MessageExchange对象,从中获取响应,然后获取标头,内容或附件。对结果运行正则表达式检查。
    9. 以下仅供参考。不打算成为一个有效的例子。

       package com.example;
      
       import org.junit.Test;
       import com.eviware.soapui.tools.SoapUITestCaseRunner;
      
       public class SoapUIProject {
      
           // runs an entire SOAPUI test suite
           @Test
           public void soapTest1() throws Exception {     
               SoapUITestCaseRunner runner = new SoapUITestCaseRunner(); 
               runner.setProjectFile("/path/to/your/W3Schools-Tutorial-soapui-project.xml");
               runner.run();      
           }
      
           // runs a single SOAPUI test step - and checks response matches a regex
           @Test
           public void soapTest2() throws Exception {     
               WsdlProject project = new WsdlProject( "src/dist/sample-soapui-project.xml" ); 
               TestSuite testSuite = project.getTestSuiteByName("My Test Suite"); 
               TestCase testCase = testSuite.getTestCaseByName("My Test Case");
               TestCaseRunner testCaseRunner = new WsdlTestCaseRunner(testCase,null);
      
               // Must have test step setup as WsdlMessageExchange for cast to work
               WsdlMessageExchangeTestStepResult testStepResult = (WsdlMessageExchangeTestStepResult)testStep.runTestStepByName("My Test Step"); 
      
               // TestStep testStep = testCase.getTestStepByName("My Test Step");
               // TestCaseRunContext testCaseRunContext = new WsdlTestRunContext(testStep);
               // testStep.prepare(testCaseRunner, testCaseRunContext); 
               // WsdlMessageExchangeTestStepResult testStepResult = (WsdlMessageExchangeTestStepResult)testStep.run(testCaseRunner, testCaseRunContext); 
      
               MessageExchange[] messageExchanges = testStepResult.getMessageExchanges();
               for (MessageExchange me : messageExchanges) {
                   String response =  me.getResponseContentAsXML();
                   // do any desired regex processing
                   // can use any desired assertions
               }
               assertEquals( Status.FINISHED, runner.getStatus() ); 
           }
      
       }
      

进一步参考:http://www.soapui.org/Scripting-Properties/tips-a-tricks.html#3-xml-nodes   http://books.google.com.au/books?id=DkWx7xZ263gC&printsec=frontcover#v=onepage&q&f=false