Prueba de cliente REST usando la herramienta Restito

¿Qué es REST?

REST significa "Transferencia de estado REpresentacional", que es una nueva forma de comunicación entre dos sistemas cualesquiera en un momento determinado. Uno de los sistemas se llama 'REST Client' y el otro se llama 'REST Server'.

En este tutorial de REST, aprenderá:

  • ¿Qué es REST?
  • ¿Qué es el cliente REST?
  • ¿Qué es el servidor REST?
  • ¿Qué es Restito?
  • ¿Cómo probar el cliente REST usando Restito?
  • Ventajas de usar Restito Framework para pruebas de clientes REST
  • Desventajas de usar Restito Framework para pruebas de cliente REST

Antes de aprender sobre Restito Framework para las pruebas de clientes REST, primero aprendamos algunos conceptos básicos.

¿Qué es el cliente REST?

REST Client es un método o una herramienta para invocar una API de servicio REST que está expuesta a la comunicación por cualquier sistema o proveedor de servicios. Por ejemplo: si se expone una API para obtener información de tráfico en tiempo real sobre una ruta de Google, el software / herramienta que invoca la API de tráfico de Google se denomina cliente REST.

¿Qué es el servidor REST?

Es un método o una API que está expuesta a la comunicación por parte de cualquier sistema o proveedor de servicios. Por ejemplo, Google expone una API para obtener información de tráfico en tiempo real en una ruta determinada.

Aquí, el servidor de Google debe estar en funcionamiento para escuchar cualquier solicitud a la API expuesta de diferentes clientes.

Ejemplo:

Es hora de establecer un escenario completo de principio a fin a partir de las definiciones anteriores.

Consideremos una aplicación de reserva de taxis como Uber, ya que una empresa necesita información en tiempo real sobre la situación del tráfico alrededor de las rutas en las que se encuentra un vehículo determinado.

Cliente de descanso:

Aquí, el cliente es una aplicación móvil de Uber en la que el conductor ha iniciado sesión. Esta aplicación envía una solicitud a la API REST expuesta por los mapas de Google para obtener los datos en tiempo real. Por ejemplo, una solicitud HTTP GET.

Resto del servidor:

En este ejemplo, Google es el proveedor de servicios y la API de Google Maps responde con los detalles requeridos a la solicitud de la aplicación Uber.

Tanto el cliente como el servidor son igualmente importantes en la comunicación REST.

Aquí, hemos implementado ejemplos para pruebas de automatización solo del cliente REST. Para probar el servidor REST, consulte https://www.guru99.com/top-6-api-testing-tool.html.

¿Qué es Restito?

Restito es un framework desarrollado por Mkotsur. Es una aplicación liviana para ayudarlo a ejecutar cualquier tipo de solicitud HTTP. Puede usar Restito para probar sus API REST y para buscar problemas en su aplicación o su red.

¿Cómo probar el cliente REST usando Restito?

Dividamos el ejercicio en los siguientes 4 pasos:

  1. Cree un cliente HTTP y un método para enviar una solicitud HTTP GET a cualquier punto final del servidor. Por ahora, considere que el punto final es http: // localhost: 9092 / getevents.
  1. Inicie un servidor Restito para escuchar y capturar las solicitudes enviadas al punto final 'getevents' en localhost http: // localhost: 9092 / getevents.
  1. Cree una clase de prueba para probar el cliente anterior. Invoque el método 'sendGETRequest' del cliente HTTP para iniciar una solicitud GET a la API 'getevents'.
  1. Valide la llamada HTTP GET usando el marco Restito.

Profundicemos en cada uno de los pasos anteriores.

Paso 1) Cree un cliente HTTP y un método para enviar una solicitud HTTP GET a cualquier punto final del servidor.

========== CÓDIGO JAVA Comienza ===========

package com.chamlabs.restfulservices.client;import java.util.HashMap;import java.util.Map;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.HttpClientBuilder;import org.json.JSONObject;/ *** Esta clase crea un cliente HTTP y tiene un método para enviar una solicitud HTTP GET:* sendGETRequest (…)* /RestClient de clase pública {/ *** Constructor para la clase RestClient* /RestClient público () {System.out.println ("Creando el constructor RestClient");}/ *** Método para enviar una solicitud GET a http: // localhost: <
> / getevents* @param puerto* @return true si la solicitud GET se envía correctamente. Falso, de lo contrario.* /public static boolean sendGETRequest (puerto int) {tratar {Cliente HttpClient = HttpClientBuilder.create (). Build ();HttpGet getRequest = new HttpGet ("http: // localhost: + puerto + "/ getevents");// HttpResponse respuesta = client.execute (solicitud);client.execute (getRequest);System.out.println ("La solicitud HTTP se envió correctamente".+ "Devolver verdadero");devuelve verdadero;}captura (Excepción e) {e.printStackTrace ();}System.out.println ("Se ha producido alguna excepción durante la creación del cliente HTTP."+ "Devolver falso");falso retorno;}}

========== FIN DEL CÓDIGO JAVA ===========

Paso 2) Inicie un servidor Restito para escuchar y capturar las solicitudes enviadas al punto final 'getevents' en localhost http: // localhost: 9092 / getevents.

========== CÓDIGO JAVA Comienza ===========

package com.chamlabs.restfultesting.util;importar com.xebialabs.restito.builder.stub.StubHttp.whenHttp estático;importar com.xebialabs.restito.semantics.Action.status estático;importar com.xebialabs.restito.semantics.Condition.get estático;importar com.xebialabs.restito.semantics.Condition.post estático;import java.util.List;importar org.glassfish.grizzly.http.util.HttpStatus;import com.xebialabs.restito.semantics.Call;import com.xebialabs.restito.server.StubServer;/ *** Esta clase de utilidad contiene varios métodos de utilidad como:* reiniciarRestitoServerForGETRequests (…)* reiniciarRestitoServerForPOSTRequests (…)* waitAndGetCallList (…)** @ autor cham6* @ correo electrónico: [email protected]* @fork: https://github.com/cham6/restfultesting.git** /TestUtil clase pública {/ *** Método de utilidad para iniciar el servidor stub restito para aceptar solicitudes GET* @param servidor* @param puerto* @param estado* /reinicio vacío estático públicoRestitoServerForGETRequests (servidor StubServer, puerto int, estado HttpStatus){// Mata al servidor restitosi (servidor! = nulo) {server.stop ();}// Inicializar y configurar una instancia más nueva del servidor stubservidor = nuevo StubServer (puerto) .run ();whenHttp (servidor) .match (get ("/ getevents")). then (status (status));}/ *** Método de utilidad para iniciar el servidor stub restito para aceptar solicitudes POST* @param servidor* @param puerto* @param estado* /reinicio vacío estático públicoRestitoServerForPOSTRequests (servidor StubServer, puerto int, estado HttpStatus){// Mata al servidor restitosi (servidor! = nulo) {server.stop ();}// Inicializar y configurar una instancia más nueva del servidor stubservidor = nuevo StubServer (puerto) .run ();whenHttp (servidor) .match (post ("/ postevents")). then (status (status));}/ *** Para un servidor stub de restito determinado, realice un bucle durante la cantidad de segundos dada* romper y devolver la lista de llamadas del servidor.** @param servidor* @param waitTimeInSeconds* @regreso* @throws InterruptedException* /Lista estática pública  waitAndGetCallList (servidor StubServer, int waitTimeInSeconds)lanza InterruptedException{int timeoutCount = 0;List  callList = server.getCalls ();while (callList.isEmpty ()) {Thread.sleep (1000);timeoutCount ++;if (timeoutCount> = waitTimeInSeconds) {descanso;}callList = server.getCalls ();}// Espere 2 segundos para obtener todas las llamadas en callList para eliminar cualquier error.Thread.sleep (2000);return server.getCalls ();}}

========== FIN DEL CÓDIGO JAVA ===========

Paso 3) Cree una clase de prueba para probar el cliente anterior. Invoque el método sendGETRequest del cliente HTTP para iniciar una solicitud GET a la API 'getevents'.

========== CÓDIGO JAVA Comienza ===========

import junit.framework.TestCase;import com.chamlabs.restfulservices.client.RestClient;import com.chamlabs.restfultesting.util.TestUtil;import com.xebialabs.restito.semantics.Call;import com.xebialabs.restito.server.StubServer;importar org.glassfish.grizzly.http.util.HttpStatus.ACCEPTED_202 estático;import org.json.JSONObject;import java.util.List;import java.util.Map;/ *** Esta clase contiene varias pruebas junit para validar las operaciones de RestClient como:* Enviar petición(… )* sendRequestWithCustomHeaders (…)* sendPOSTRequestWithJSONBody (…)** /RestClientTester de clase pública extiende TestCase {Entero final estático privado PUERTO = 9098;Entero final estático privado PORT2 = 9099;Entero final estático privado PORT3 = 9097;public RestClientTester () {System.out.println ("Iniciando la prueba RestClientTester");}/ *** Prueba de Junit para validar la solicitud GET de RestClient* Pasos:* 1) Cree un servidor stub usando el marco de Restito y configúrelo para escuchar en un puerto dado* 2) Invocar el método sendGETRequest (…) de RestClient* 3) Restito captura las solicitudes GET correspondientes enviadas, si las hay.* 4) Validar si Restito ha capturado alguna solicitud GET en un punto final dado* Comportamiento esperado:*> Restito debería haber capturado la solicitud GET y debería haber capturado solo una solicitud GET.* Finalmente:*> Detenga el servidor stub que comenzó a usar restito.* /public void testGETRequestFromClient () {StubServer server = null;tratar {// Esto iniciará el servidor stub en 'PORT' y responde con HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForGETRequests (servidor, PUERTO, ACCEPTED_202);RestClient.sendGETRequest (PUERTO);List  callList = TestUtil.waitAndGetCallList (servidor, 30);asertTrue ("La solicitud GET no se recibe del RestClient. La prueba falló",(callList! = null) && (callList.size () == 1));}captura (Excepción e) {e.printStackTrace ();fail ("Prueba fallida debido a una excepción: + e);}finalmente {si (servidor! = nulo) {server.stop ();}}}

========== FIN DEL CÓDIGO JAVA ===========

Paso 4) Cómo validar la solicitud GET con encabezados y la solicitud POST con el cuerpo usando el marco Restito.

========== CÓDIGO JAVA Comienza ===========

/ *** Prueba de Junit para validar la solicitud GET con encabezados de RestClient* Pasos:* 1) Cree un servidor stub usando el marco de Restito y configúrelo para escuchar en un puerto dado* 2) Invocar el método sendGETRequestWithCustomHeaders (…) de RestClient* 3) Restito captura las solicitudes GET correspondientes enviadas, si las hay.* 4) Validar si Restito ha capturado alguna solicitud GET en un punto final determinado* Comportamiento esperado:*> Restito debería haber capturado la solicitud GET, y debería haber capturado solo una solicitud GET.*> Obtener los encabezados de la solicitud GET capturada* y asegúrese de que los encabezados coincidan con los configurados.* Finalmente:*> Detenga el servidor stub que comenzó a usar restito.* /public void testGETRequestWithHeadersFromClient () {StubServer server = null;tratar {// Esto iniciará el servidor stub en 'PORT' y responde con HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForGETRequests (servidor, PORT2, ACCEPTED_202);RestClient.sendGETRequestWithCustomHeaders (PORT2);List  callList = TestUtil.waitAndGetCallList (servidor, 30);asertTrue ("La solicitud GET no se recibe del RestClient. La prueba falló",(callList! = null) && (callList.size () == 1));// Validar los encabezados de la solicitud GET del cliente RESTMap > headersFromRequest = callList.get (0) .getHeaders ();assertTrue ("La solicitud GET contiene el encabezado Accept y su valor",headersFromRequest.get ("Aceptar"). contiene ("texto / html"));assertTrue ("La solicitud GET contiene la autorización del encabezado y su valor",headersFromRequest.get ("Autorización"). contains ("Portador 1234567890qwertyuiop"));assertTrue ("La solicitud GET contiene el encabezado Cache-Control y su valor",headersFromRequest.get ("Cache-Control"). contains ("no-cache"));assertTrue ("La solicitud GET contiene la conexión del encabezado y su valor",headersFromRequest.get ("Conexión"). contiene ("mantener vivo"));asertTrue ("La solicitud GET contiene el tipo de contenido del encabezado y su valor",headersFromRequest.get ("Tipo de contenido"). contiene ("aplicación / json"));}captura (Excepción e) {e.printStackTrace ();fail ("Prueba fallida debido a una excepción: + e);}finalmente {si (servidor! = nulo) {server.stop ();}}}
/ *** Prueba de Junit para validar la solicitud POST con cuerpo y encabezados de RestClient* Pasos:* 1) Cree un servidor stub usando el marco de Restito y configúrelo para escuchar en un puerto dado* 2) Invocar el método sendPOSTRequestWithJSONBody (…) de RestClient* 3) Restito captura las solicitudes POST correspondientes enviadas, si las hay.* 4) Validar si Restito ha capturado alguna solicitud POST en un punto final determinado* Comportamiento esperado:*> Restito debería haber capturado la solicitud POST y debería haber capturado solo una solicitud POST.*> Obtenga el cuerpo de la solicitud POST capturada y valide los valores JSON* Finalmente:*> Detenga el servidor stub que comenzó a usar restito.* /testPOSTRequestWithJSONBody () {StubServer server = null;tratar {// Esto iniciará el servidor stub en 'PORT' y responde con HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForPOSTRequests (servidor, PORT3, ACCEPTED_202);RestClient.sendPOSTRequestWithJSONBody (PORT3);List  callList = TestUtil.waitAndGetCallList (servidor, 30);asertTrue ("La solicitud POST no se recibe del RestClient. La prueba falló.",(callList! = null) && (callList.size () == 1));// Validar los encabezados de la solicitud GET del cliente RESTString requestBody = callList.get (0) .getPostBody ();JSONObject postRequestJSON = new JSONObject (requestBody);asertTrue ("El timeUpdated en json es incorrecto",postRequestJSON.get ("timeUpdated"). toString (). equalsIgnoreCase ("1535703838478"));asertTrue ("El access_token en json es incorrecto",postRequestJSON.get ("token_acceso"). toString ().equalsIgnoreCase ("abf8714d-73a3-42ab-9df8-d13fcb92a1d8"));asertTrue ("El refresh_token en json es incorrecto",postRequestJSON.get ("actualizar_token"). toString ().equalsIgnoreCase ("d5a5ab08-c200-421d-ad46-2e89c2f566f5"));asertTrue ("El token_type en json es incorrecto",postRequestJSON.get ("token_type"). toString (). equalsIgnoreCase ("portador"));asertTrue ("El expires_in en json es incorrecto",postRequestJSON.get ("expires_in"). toString (). equalsIgnoreCase ("1024"));asertTrue ("El alcance en json es incorrecto",postRequestJSON.get ("alcance"). toString (). equalsIgnoreCase (""));}captura (Excepción e) {e.printStackTrace ();fail ("Prueba fallida debido a una excepción: + e);}finalmente {si (servidor! = nulo) {server.stop ();}}}}

========== FIN DEL CÓDIGO JAVA ===========

Ventajas de usar Restito Framework para pruebas de clientes REST

Aquí están los pros y los beneficios de Restito Framework para las pruebas de clientes de ReST

  • No es necesario que se desarrolle el servidor REST real para probar el cliente REST.
  • Restito proporciona utilidades y métodos sólidos y variados para simular diferentes comportamientos de un servidor. Por ejemplo: para probar cómo se comporta el cliente REST cuando el servidor responde con un error HTTP 404 o un error HTTP 503.
  • Los servidores de Restito se pueden configurar en pocos milisegundos y se pueden terminar después de que se completen las pruebas.
  • Restito admite todo tipo de contenido de métodos HTTP como comprimido, no comprimido, unificado, aplicación / texto, aplicación / JSON, etc.

Desventajas de usar Restito Framework para pruebas de cliente REST

A continuación, se muestran las desventajas / desventajas de Restito Framework para las pruebas de clientes de ReST

  • La fuente del cliente REST debe modificarse para considerar 'localhost' como una máquina servidor.
  • Abrir el servidor en cualquier puerto puede entrar en conflicto si usamos algún puerto de uso común como '8080' o '9443', etc.
  • Se recomienda utilizar puertos como 9092 o 9099, que no suelen ser utilizados por otras herramientas.

Resumen:

  • REST significa "Transferencia de Estado REpresentacional", que es una nueva forma estándar de comunicación entre dos sistemas cualesquiera en un momento determinado.
  • REST Client es un método o una herramienta para invocar una API de servicio REST que está expuesta a la comunicación por parte de cualquier sistema o proveedor de servicios.
  • En el método RestServer o una API que está expuesta para la comunicación por cualquier sistema o proveedor de servicios.
  • Restito es una aplicación liviana para ayudarlo a ejecutar cualquier tipo de solicitud HTTP
  • Cree un cliente HTTP y un método para enviar una solicitud HTTP GET a cualquier punto final del servidor
  • Inicie un servidor Restito para escuchar y capturar las solicitudes enviadas al endpoint 'getevents'.
  • Inicie un servidor Restito para escuchar y capturar las solicitudes enviadas al endpoint 'getevents' en localhost
  • Aquí, hemos implementado ejemplos para pruebas de automatización solo del cliente REST.
  • No es necesario que se desarrolle el servidor REST real para probar el cliente REST.
  • La fuente del cliente REST debe modificarse para considerar 'localhost' como una máquina servidor.

Este artículo es una contribución de Chandrasekhar Muttineni

Articulos interesantes...