1

我正在编写一个 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 服务并检查响应是否包含相应的正则表达式(埃斯)。(“数据”变量目前仅对应来自属性文件的一个 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();
            }
        }

关于这样做的最佳方式的任何想法?任何帮助是极大的赞赏

4

2 回答 2

2

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

第 1 步:将整个响应作为字符串获取:

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

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

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

if( response.matches(regex) ) { ... }
于 2013-06-23T03:22:49.363 回答
1

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

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

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

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

  • 您可以使用XPath 或 XQuery 表达式来验证 XML
  • 您可以使用脚本断言

    例如,如果您的 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 文件中,并按照此处的说明放置在 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 对象,从中获取响应,然后获取标头、内容或附件。对结果运行正则表达式检查。

    以下内容仅供参考。不打算成为一个工作示例。

     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=一页&q&f=假

于 2013-06-27T12:55:41.510 回答