Pruebas automatizadas de servicios web, Parte 2: Pruebas de servicios web con XMLUnit

Aprendizaje de técnicas de automatización mediante el uso de la plataforma de desarrollo IBM Rational Software Architect

Esta serie de tutoriales, desarrollada para testers profesionales y desarrolladores interesados en pruebas de servicio web funcionales, lo guía a través de la automatización de pruebas de servicio web típicas que usan tecnologías tales como JUnit, Apache Commons HttpClient y Apache XMLUnit. En esta entrega, Parte 2, aprenderá acerca de cómo crear un servicio web simple, cómo usar HttpClient para invocar un servicio web y cómo comparar una respuesta esperada con una respuesta real con XMLUnit. Los autores demuestran estas técnicas en la plataforma de desarrollo IBMRational® Software Architect.

Mohan Jadhav, Software Engineer , IBM China

Mohan Jadhav photoMohan K Jadhav es software engineer en IBM India Software Labs, Bangalore. Actualmente trabaja en ofertas RFID de IBM y tiene experiencia en pruebas y diseños de automatización.


Nivel de autor contribuyente en developerWorks

Mansoor Ahmed, Software Engineer, IBM Software Labs, Bangalore

Mansoor Ahmed photoMansoor Ahmed es software engineer en IBM India Software Labs, Bangalore. Actualmente trabaja en WebSphere Messaging and Data Services, un producto de telecomunicaciones, y es experto en servicios Web y en desarrollos de código abierto.



05-08-2011

Antes de comenzar

Acerca de esta serie

Los servicios web son componentes cada vez más esenciales en las aplicaciones de negocios y, con el surgimiento de paradigmas tales como Service-Oriented Architecture (SOA), la focalización en servicios web continúa en crecimiento. En estas aplicaciones orientadas hacia servicios, y fundamentales para los servicios, probar servicios web adquiere igual significación. Una creación e implantación rápida de servicios web complejos, representa un desafío para el equipo QA. La automatización de pruebas de servicios web puede ayudar al equipo a gestionar los esfuerzos de manera eficiente.

Probar servicios web generalmente incluye las siguientes tareas:

  1. Generar un cliente o un código esqueleto para el servicio web
  2. Definir datos de entrada para la prueba
  3. Invocar el servicio web por medio del cliente o el código esqueleto
  4. Verificar que la respuesta real sea similar a la respuesta esperada

De esas actividades, la generación del cliente o el código esqueleto y la verificación de respuestas, son las que requieren de un mayor esfuerzo.

Existen varias herramientas disponibles para generar un cliente o código esqueleto para un servicio web en base al archivo WSDL (Descripción de Lenguajes de servicios de web). No obstante, el código generado podría estar patentado y, por lo tanto, necesitar regenerarse cada vez que cambia WSDL. Una solución a este problema es la de eliminar la generación del cliente o código esqueleto e invocar el servicio web directamente a través de un cliente HTTP genérico. Más adelante en la serie, se verá ese kit de herramientas que Apache Commons HttpClient (en adelante llamado HttpClient) API provee.

Del mismo modo, la verificación de respuestas generalmente implica alguna clase de intervención manual que depende de la complejidad del contenido de la respuesta. Si la respuesta contiene elementos simples, la verificación puede ser simple, ya que sólo se requiere controlar el valor en el elemento simple. Para las respuestas que contienen elementos complejos y una larga lista de tales elementos complejos, la verificación manual puede requerir de un esfuerzo mucho mayor.

Esta serie sirve de introducción a una técnica para automatizar pruebas de un servicio web típico con un array de tecnologías tales como JUnit, HttpClient y Apache XMLUnit (en adelante llamado XMLUnit). La técnica se demuestra en la plataforma de desarrollo que ofrece IBM Rational Software Architect.

Esta serie consta de tres partes:

  • La Parte 1 demostró cómo crear un servicio web simple con IBM Rational Software Architect.
  • La Parte 2 introduce XMLUnit, que ofrece API para comparar dos archivos en formato XML.
  • La Parte 3 prueba un servicio web protegido con IBM Rational Software Architect y con XMLUnit

Acerca de este tutorial

En este segundo tutorial de la serie, se creará un servicio web simple, se usará HttpClient para invocar un servicio web y se comparará la respuesta esperada con la respuesta real con XMLUnit, todo esto se hará en la plataforma de desarrollo IBM Rational Software Architect.

Requisitos previos

Para poder seguir este tutorial, se deberá tener un conocimiento básico del servicio web y de su desarrollo en Java, y tener alguna exposición a herramientas de prueba unitarias, tales como JUnit.

Requisitos del sistema

Para completar este tutorial se necesita el siguiente software:


Definir datos de entrada y salida

En la Parte 1 de esta serie, se creó un servicio web de muestra que devolvía una lista de usuarios. A continuación se deberá especificar la solicitud y la respuesta esperada al servicio web.

Solicitud

Generalmente, la solicitud de un servicio web viene en formato SOAP. Para el servicio web de muestra, por ejemplo, la solicitud se verá como el Listado 1.

En el Listado 1, se invoca el método getUsers() en el servicio web. El texto sobre el método constituye el encabezado SOAP. También se podría adjuntar en la solicitud un encabezado personalizado.

Listado 1. Solicitud al servicio web
                    <?xml version="1.0" encoding="UTF-8" ?> 
<?xml version="1.0" encoding="UTF-8" ?> 
<SOAP-ENV:Envelope 
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
 xmlns:q0="http://sample.ws.ibm.com" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
  <q0:getUsers/> 
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Salvar la solicitud en un archivo XML, como por ejemplo C:\wssample\request.xml.

Respuesta esperada

La respuesta esperada para la muestra del servicio web es la lista de usuarios del Listado 2.

Listado 2. Lista de usuarios
<?xml version="1.0" encoding="UTF-8" ?> 
<SOAP-ENV:Envelope 
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
  xmlns:q0="http://sample.ws.ibm.com" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  
  <SOAP-ENV:Body>
    <getUsersReturn>  
      <User>  
        <name>John</name>   
        <address>    
          <street>Park Street</street>     
          <city>Washington</city>     
          <zip>012345</zip>     
        </address>    
      </User>  
      <User>    
        <name>Mohan</name>   
        <address>    
          <street>Avenue Street</street>     
          <city>Bangalore</city>     
          <zip>456789</zip>     
        </address>    
      </User>  
      <User>    
        <name>Mansoor</name>   
        <address>    
          <street>Martin Street</street>     
          <city>Bangalore</city>     
          <zip>135791</zip>     
        </address>    
      </User>    
    </getUsersReturn>      
  </SOAP-ENV:Body>

</SOAP-ENV:Envelope>

En el Listado 2, getUsersReturn es el elemento raíz de la respuesta. Éste ignora el encabezado SOAP. Guardar esta respuesta esperada en un archivo XML, como por ejemplo C:\wssample\expected_response.xml.

Escribir el cliente de invocación para el servicio web

Una vez definidos y almacenados los datos de prueba de entrada y de salida del servicio web en el disco, lo siguiente es escribir el código cliente para invocar el servicio web con HttpClient API:

  1. Abrir Rational Software Architect y haga clic en Menu > Window > Open Perspective > Java (Menú > Window > Abrir Perspectiva > Java).
  2. Ir a File > New > Project... > Java Project (Archivo > Nuevo > Proyecto... > Proyecto Java), como muestra la Figura 1.
    Figura 1. Nuevo proyecto
    Nuevo proyecto
  3. Como se muestra en la Figura 2, ingrese un nombre de proyecto, como por ejemplo SampleTestProject, y haga clic en Next (Siguiente).
    Figura 2. Creación de un proyecto Java
    Creación de un proyecto Java
  4. En la página Java Settings (Configuraciones Java), haga clic en SampleTestProject y luego haga clic en el botón Add Folder (Agregar carpeta).
  5. Ingrese src como nombre de la carpeta fuente y haga clic en OK, como muestra la Figura 3.
    Figura 3. Página de configuraciones Java
    Página de configuraciones Java
  6. El asistente pregunta ¿Desea eliminar el proyecto como carpeta de origen y actualizar la carpeta build output (resultado de la compilación) a 'SampleTestProject/bin'? (ver Figura 4). Elegir Yes (Sí).
    Figura 4. Nueva carpeta de origen
    Nueva carpeta de origen
  7. Haga clic en Finish (Finalizar). La vista del proyecto se deberá ver como la Figura 5.
    Figura 5. Vista del proyecto Java
    Vista del proyecto Java
  8. A continuación, cree un paquete en la carpeta src, como por ejemplo com.ibm.ws.sample.test. Este paquete tendrá el código de prueba.
  9. Cree una carpeta llamada lib bajo SampleTestProject: haga clic con el botón derecho en SampleTestProject y seleccione New > Folder
  10. Agregue los archivos .jar commons-codec-1.3.jar, commons-logging.jar y commons-httpclient-3.0.1.jar a la carpeta lib.
  11. Agregue los archivos .jar a la ruta de acceso de compilación del proyecto: haga clic con el botón derecho en el proyecto y seleccionar Properties (Propiedades).
  12. Seleccione Java Build Path en el panel izquierdo, luego seleccionar la pestaña Libraries (Bibliotecas) a la derecha, como se muestra en la Figura 6.
    Figura 6. Propiedades para SampleTestProject
    Propiedades para SampleTestProject
  13. Haga clic en el botón Add JARs.... Luego seleccione los archivos .jar en la carpeta lib y haga clic en OK, como se muestra en la Figura 7.
    Figura 7. Selección de JAR
    Selección de JAR
  14. Haga clic en OK en la página Properties.
  15. A continuación, cree una clase Java llamada SampleHttpClient.java en el paquete com.ibm.ws.sample.test, como se muestra en el Listado 3.
    Listado 3. Crear una clase Java
     package com.ibm.ws.sample.test;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.methods.PostMethod;
    import org.apache.commons.httpclient.methods.RequestEntity;
    import org.apache.commons.httpclient.methods.StringRequestEntity;
    
    public class SampleHttpClient 
    {  
      public static String invokeWebService(String webServiceURL, 
        String  requestXMLPath) 
      throws FileNotFoundException, Exception  
      {    
        PostMethod post = null;    
        HttpClient client = new HttpClient();    
        
        try     
        {      
          // Read the SOAP request from the file      
          StringBuffer requestFileContents = new StringBuffer();      
          BufferedReader bufferedReader = new BufferedReader
          (new FileReader(requestXMLPath));      
          String line = null;		      
          
          while((line = bufferedReader.readLine()) != null)      
          {        
            requestFileContents.append(line);      
          }      
          
          post = new PostMethod(webServiceURL);      
          post.setRequestHeader("Accept","application/soap+xml,application/
          dime,multipart/related,text/*");      
          post.setRequestHeader("SOAPAction", "");            
          
          // Request content will be retrieved directly from the input stream      
          RequestEntity entity = new StringRequestEntity(requestFileContents
          .toString(), "text/xml",  "utf-8");      
          post.setRequestEntity(entity);            
          
          // Returns a number indicating the status of response	          
          int result = client.executeMethod(post);      
          String response = post.getResponseBodyAsString();      
          return response;    
        }     
        
        finally     
        {      
          // Release current connection to the connection pool once you are done      
          post.releaseConnection();     
        }  
      }
    }
  16. Guardar y construir el proyecto.

Invocar el servicio web desde una prueba JUnit

En la sección anterior, se creó un HttpClient simple para invocar el servicio web con una solicitud dada. En esta sección, se creará una prueba JUnit que usa este cliente.

  1. Haga clic con el botón derecho en el paquete com.ibm.ws.sample.test y agregar una nueva prueba JUnit, tal como SampleTest, con New > Other... > Java > JUnit > JUnit Test Case Nuevo > Otro…> Java > JUnit > Caso de prueba JUnit).
  2. Crear el método de prueba que se muestra en el Listado 4.
  3. Guardar y construir el proyecto.
  4. Haga clic con el botón derecho en SampleTest.java y ejecute como JUnit. Se verá la respuesta del servicio web impresa a la consola.
Listado 4. Método de prueba
package com.ibm.ws.sample.test;
  
import java.io.FileNotFoundException;
import junit.framework.TestCase;
  
public class SampleTest extends TestCase 
{  
 public void test() throws FileNotFoundException, Exception  
 {    
   // Web service URL    
   final String wsURL = "http://localhost:9080/SampleProject/services/Users";
      
   // Request XML path    
   final String requestXMLPath = "C:/wssample/request.xml";    
      
   // Invoke the Web service    
   String webServiceResponse = SampleHttpClient.invokeWebService(wsURL,requestXMLPath);
   System.out.println("Response: " + webServiceResponse);    
 }
}

Verificar la prueba con XMLUnit

En la sección anterior, se creó una prueba JUnit para invocar al servicio web y obtener la respuesta. Ahora deberá modificar la prueba JUnit para almacenar la respuesta verdadera del servicio web en un archivo y luego compararlo con la respuesta esperada con XMLUnit API.

  1. Agregue xmlunit1.0.jar a la ruta de acceso de compilación del proyecto.
  2. Modifique el método de prueba JUnit mediante el agregado del código en azul, al código que se muestra en el Listado 5.
    Listado 5. Comparación de respuestas
    package com.ibm.ws.sample.test;
      
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.FileOutputStream;
      import java.io.InputStreamReader;
      import java.io.OutputStreamWriter;
      import java.io.Reader;
      import junit.framework.TestCase;
      import org.custommonkey.xmlunit.Diff;
      import org.custommonkey.xmlunit.XMLAssert;
      import org.custommonkey.xmlunit.XMLUnit;
      
      public class SampleTest extends TestCase 
      {  
        public void test() throws FileNotFoundException, Exception  
        {    
          // Web service URL    
          final String wsURL = "http://localhost:9080/
          SampleProject/services/Users";		    
          
          // Request XML path    
          final String requestXMLPath = "C:/wssample/request.xml";      
          
          // Expected response path    
          final String expectedXMLPath = 
            "C:/wssample/expected_response.xml";		    
          
          // Actual response path    
          final String actualXMLPath = "C:/wssample/actual_response.xml";	    
          
          // Encoding     
          final String encoding = "UTF-8";		    
          
          // Invoke the web service    
          String webServiceResponse = SampleHttpClient.invokeWebService
          (wsURL,requestXMLPath);
          
          // Store the response in the disk    
          File responseFile = new File(actualXMLPath);    
          responseFile.createNewFile();    
          OutputStreamWriter oSW = new OutputStreamWriter
          (new FileOutputStream(responseFile),encoding); 
          oSW.write(webServiceResponse);	    
          oSW.flush();    
          oSW.close();    
          
          // Compare the responses    
          Reader expectedXMLReader = new InputStreamReader
          (new FileInputStream(expectedXMLPath), encoding);    
          Reader actualXMLReader = new InputStreamReader
          (new FileInputStream(actualXMLPath), encoding);    
          
          // Ignore the white space while comparing    
          XMLUnit.setIgnoreWhitespace(true);		    
          
          // Diff object, which contains the differences, if any    
          Diff xmlDiff = new Diff(expectedXMLReader, actualXMLReader);		    
          
          // "false" ignores the order of the users in the XMLs    
          XMLAssert.assertXMLEqual(xmlDiff,false);  
        }
    }
  3. Guardar y construir el proyecto.
  4. Haga clic con el botón derecho en SampleTest.java y ejecute como JUnit.
  5. La consola JUnit aparece en verde para indicar que la prueba pasó tal como lo muestra la Figura 8.
    Figura 8. Consola JUnit
    Consola JUnit
  6. A continuación, cambie la solicitud del usuario en la respuesta esperada y ejecute la prueba nuevamente. Abra la respuesta XML esperada en C:\wssample\expected_response.xml.
  7. Cambiar la solicitud del usuario como se muestra en el Listado 6.
    Listado 6. Nueva solicitud del usuario
    <?xml version="1.0" encoding="UTF-8" ?>
      <SOAP-ENV:Envelope 
        xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:q0="http://sample.ws.ibm.com" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        
        <SOAP-ENV:Body>
          <getUsersReturn>  
          <User>    
            <name>Mohan</name>   
            <address>    
              <street>Avenue Street</street>     
              <city>Bangalore</city>     
              <zip>456789</zip>     
            </address>    
          </User>  
          <User>    
            <name>Mansoor</name>   
            <address>    
              <street>Martin Street</street>     
              <city>Bangalore</city>     
              <zip>135791</zip>     
            </address>    
          </User>  
          <User>  
            <name>John</name>   
            <address>    
              <street>Park Street</street>     
              <city>Washington</city>     
              <zip>012345</zip>     
            </address>    
          </User>    
          </getUsersReturn>      
        </SOAP-ENV:Body>
    
    </SOAP-ENV:Envelope>
  8. Guarde el archivo y vuelva a ejecutar la prueba. Debería pasar nuevamente.

Conclusión

En este tutorial, usted aprendió una técnica para automatizar la prueba de datos de salida del servicio web con HttpClient y de XMLUnit API. Específicamente, aprendió cómo:

  • Crear un servicio web simple.
  • Usar HttpClient para invocar un servicio web.
  • Comparar las respuestas esperadas con las respuestas reales con XMLUnit.

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=SOA y servicios web
ArticleID=678267
ArticleTitle=Pruebas automatizadas de servicios web, Parte 2: Pruebas de servicios web con XMLUnit
publish-date=08052011