Testing Restful API response

Introducción

Hace un tiempo publiqué un artículo sobre cómo “testear” funcionalmente la Restful API, los podéis leer en:

https://qajungle.com/restful-api-functional-testing/
http://blog.engineering.ticketbis.com/rest-api-functional-testing/

En el proyecto en el que he estado trabajando he necesitado tener que validar que el json de respuesta tenga una estructura en concreto y que los campos cumplan ciertas condiciones.

Al principio no necesitaba validar grandes cosas por lo que simplemente creé una clase utilidad que me ayudará a comprobar que el json de respuesta tendría los campos que esperábamos, pero esto suponía varios problemas o deficiencias:

  • Únicamente podría validar la existencia del campo, pero no ningún tipo de restricción.
  • Duplicidad de código a medida que se añaden más pruebas.
  • Un cambio en la definición del json implicaría refactorizar las pruebas.

Debido a estos motivos pensé que tenía que haber una forma más sencilla que permitiera suplir estas deficiencias. Me acordé de cómo cuando construimos un XML definimos su esquema de tal forma que validamos su estructura de una forma sencilla, por lo que me puse a investigar y encontré lo siguiente:

http://json-schema.org/

Mediante json-schema definimos la estructura que tiene que cumplir nuestro json por lo que podía ser una buena baza ya que nos permitiría:

  • Validar la estructura y ciertas restricciones.
  • Únicamente tenemos los esquemas por lo que evitamos duplicidad de código.
  • Un cambio en la definición únicamente nos obliga a cambiar el esquema y no refactorizar el código.

Solucionamos los problemas con los que nos hemos visto y encima mantenemos cierta independencia en lo que es la validación de la estructura del json y el test funcional.

Configuración del proyecto

Lo primero que tenemos que hacer implementar un validador json que nos permita comparar nuestro esquema con la respuesta obtenida, para ello he hecho uso del plugin:

https://github.com/fge/json-schema-validator
Lo cierto es que actualmente el plugin no tiene un mantenimiento pero está desarrollado para la versión actual del esquema v4.

En nuestro caso como hemos desarrollado sobre un proyecto grails lo añadiremos en el BuildConfing.groovy como dependencia:

dependencies {
...
compile "com.github.fge:json-schema-validator:2.2.6"
}

Clase utilidad

Para poder simplificar y no duplicar código creamos una clase utilidad:

Básicamente lo que hacemos es cargar el esquema json que hemos definido y validarlo frente a la respuesta obtenida de la llamada a la API.

Una de las características es que nos proporciona un reporte de los errores de validación por lo que nos dará información de los incumplimientos.

Definición del esquema

Siguiendo el ejemplo visto en el artículo https://qajungle.com/restful-api-functional-testing/ vamos a generar el esquema para la respuesta de los post.

Únicamente definimos las tres propiedades que esperamos: id, title, body e indicamos que son campos requeridos por lo que si en la respuesta no obtenemos el campo o es nulo no pasará la validación.

Más información sobre la definición de esquemas:

http://json-schema.org/examples.html

Validando la respuesta

Para validar la respuesta únicamente llamaríamos al método de la clase utilidad pasándole la ruta del esquema correspondiente:

JsonValidationUtils.validateJson(response.text, "src/java/schemes/post.json")

Conclusiones

Si nos encontramos con el caso que tener que validar la estructura de la respuesta obtenida de Restful API puede ser interesante utilizar algún tipo de validador ya que nos aporta mayor potencia para el testeo de la respuesta así como evitar duplicidad de código y evitarnos tener que hacer gran refactorización de nuestro código.

Bibliografía

  1. http://json-schema.org/
  2. https://github.com/fge/json-schema-validator

Restful API Functional testing

Introducción

Llevo unos días trabajando en un proyecto interno para realizar pruebas funcionales de la API que proporcionamos en Ticketbis (http://api.ticketbis.com/).

Buscando simplicidad y robustez decidimos hacer uso de Restfulapi, el plugin de grails (https://github.com/restfulapi/restful-api) que nos proporciona las clases necesarias para realizar “testing” funcional sobre cualquier API Restful. El proyecto está siendo tan interesante que me he propuesto hacer el siguiente post.

Antes de ponernos manos a la obra comentar un par de detalles:

Configuración

El plugin restfulapi nos permite hacer uso de Spock poder basar nuestras pruebas en la metodología TDD. Para ello vamos a necesitar importar el plugin net.hedtech.restfulapi.spock.

Nuestra clase deberá extender de RestSpecification.

Test petición GET

Para “testear” la llamada necesitaremos construir la petición get con las cabeceras.

get("[URL_PETICIÓN]") {
      headers[[CABECERA]] = [VALOR_CABECERA]
}

Y finalmente comprobar que la respuesta que obtenemos de la petición get es la esperada:

  • Obtenemos las cabeceras de la petición mediante:
    responseHeader([HEADER])
  • Para obtener el estado de la petición usaremos:
    response.status

Si queremos validar el JSON de la respuesta podemos hacer uso de grails.converters.JSON.

def json = JSON.parse response.text

Veámoslo con el siguiente ejemplo donde validamos una petición get mediante la que obtenemos el post de un blog.

Test petición PUT

Por último vamos a ver como podemos "testear" una petición PUT de la API.

Construiremos la petición PUT con las cabeceras y el cuerpo.

put("[URL_PETICIÓN]") {
headers[[CABECERA]] = [VALOR_CABECERA]
body {
"""
{
"[CLAVE]": "[VALOR]",
"[CLAVE_N]": "[VALOR_N]"
}
"""
}
}

Vemos como en el siguiente ejemplo validamos la respuesta de una petición put en la que modificamos un post del blog.

Conclusiones

El plugin restfulapi de grails nos permite de una forma sencilla probar funcionalmente las diferentes peticiones a la api:

  • GET
  • POST
  • PUT
  • DELETE

El hecho de que proporcione Spock framework nos aporta mayor sencillez y legibilidad a nuestros "teses".

Bibliografía:

1. https://github.com/restfulapi/restful-api
2. https://github.com/spockframework/spock-example