10

Jan

Publicado por: Marc Sances | APIs | Mock | Working software

El mock de APIs y su papel en el testing de aplicaciones

Quienes constantemente trabajamos con TDD (Desarrollo guiado por pruebas de software, o Test-driven development), muy a menudo nos encontramos con la dependencia de ciertos elementos que pueden estar fuera de contexto con el sistema que queremos probar en nuestros tests (el System Under Test o SUT).

Esto ocurre por ciertas dependencias que pueden traer efectos colaterales sobre el resultado de las pruebas. Lo que se traduce en futuros errores o incluso, estas dependencias pueden no estar (todavía) implementadas, al estar el sistema en una fase temprana de desarrollo.

Te podría interesar: Beneficios Del Desarrollo De Software TDD

Los mocks de API: Fingiendo hasta lograrlo

Pero, ¿cómo se resuelve este problema?. Lo primero que se puede hacer es reemplazar estas dependencias por lo que se conoce como mock. Esto logrará que se devuelvan los resultados esperados para hacer las peticiones a dichas dependencias, sin realizar ninguna operación real o compleja.

Te daré como ejemplo el servidor de un blog. En este caso, quiero probar la funcionalidad de borrar un comentario (que requiere ser moderador).

Simplificando mucho el caso, tendría un flujo parecido al siguiente:

Un usuario hace click en el botón de borrar y así, el servidor del blog comprobará que el usuario es moderador antes de llevar adelante la operación.

Pero como no quiero probar que la gestión de usuarios funciona correctamente, ya que no es prioridad, ni entra dentro de mis responsabilidades; haré un mock de las clases encargadas de verificar que el usuario es un moderador, para que devuelva siempre “cierto” o “falso” y así, ver exclusivamente el comportamiento del método de “borrar comentario”.

En lugar de ir a “Gestor Usuarios”, la petición “es Moderador” irá al mock, que siempre responderá afirmativamente.

Los mocks funcionan muy bien en TDD, habiendo incluso frameworks destinados a este fin como Mockito pero, ¿y si quiero probar toda la aplicación?

Te podría interesar: Descubriendo BDD: Desarrollo guiado por el comportamiento

Vamos a ello…

Cuando vamos más allá del TDD, entramos al mundo de las pruebas de integración, testing funcional y BDD. A este punto ya entraríamos a la misma necesidad que en el TDD.

Es decir, si estoy desarrollando aplicaciones que deben hacer peticiones a un servidor central, primero tendré que comprobar que la aplicación esté bien diseñada, esto evitaría una posible contaminación de probables errores y faltas de datos en el lado del backend.

Por ejemplo, seguiré con el caso del blog. Ahora que estoy diseñando la interfaz del blog quiero comprobar que el usuario tiene permisos para borrar el comentario, como antes; sin embargo, este proceso se verificará desde el lado del backend.

Al pulsar el botón “Borrar”, se hará una solicitud de “DELETE” a http://miblogapi.example.com/comments/212 y, en caso de que se devuelva una respuesta 403 (Forbidden), se mostrará el mensaje de error.

¿Cómo puedo probar que se muestra el mensaje de error sin tener que crear un usuario “no moderador”?

Servidores de mocks, la solución

La respuesta pasa por crear un servidor de mocks, esto significa que el servidor imitará el comportamiento de nuestro servidor real, devolviendo datos de prueba o datos esperados tras las peticiones que quiero poner a prueba.

De este modo, el servidor de mocks tendrá una petición de “DELETE” de parte de http://soyunmock.example.com/comments/212 que devolverá siempre el error 403, y así es comprobar el mensaje de error.

En lugar de ir al servidor del blog, redirigiré la petición al servidor de mocks, el cual no hará ninguna consulta e indicará directamente que el usuario no está autorizado.

Herramientas

Hay muchos frameworks destinados a la creación de servidores de mocks, como el apropiadamente nombrado MockServer, WireMock o Sandbox. Otros son más simples y facilitar el proceso, permitiendo indicar la respuesta a dar directamente, como Mocky o MockBin. Incluso, la herramienta de desarrollo de API Postman ofrece un servidor de mocks integrado.

De todos ellos, el que me parece más interesante es Sandbox, pues permite añadir un poco de lógica al mock usando JavaScript. Así, se puede comprobar el proceso de algún dato concreto, validar las cabeceras, o generar datos aleatorios. Si profundizo un poco más, puedo programarlos para que las respuestas varíen en función de las peticiones, y simular, en cada momento, las respuestas que las pruebas concretas necesitan o sean necesarias.

Y no solo para probar…

A veces los mocks de API se convierten realmente en una herramienta completa de desarrollo. Cuando hay dos equipos trabajando en paralelo, uno en el servidor y otro en la interfaz del usuario, no es aceptable que el equipo de interfaz esté bloqueado esperando a que el servidor esté terminado para poder empezar a desarrollar el frontend. Esto además de restar tiempo en el desarrollo del proyecto, le quita agilidad al equipo.

Como solución a este problema que puede ser frustrante para el equipo, te ofrezco un mock del servidor que responde preguntas triviales y te permitirá avanzar notablemente con el desarrollo sin depender del desarrollo del backend.

Eso sí, ten en cuenta que es muy importante que la API esté bien diseñada y documentada, ya que si hay errores en la especificación, habrá disparidad en el comportamiento de los mocks, causando que el frontend no termine de encajar cuando se haga el cambio al backend real.

Los mocks de API son una herramienta muy potente que permite desarrollar y probar el front-end como un componente independiente del back-end, facilitando y reduciendo tiempos de desarrollo, lo que se traduce en el aumento de la productividad del equipo.

Artículos relacionados:

¿Qué es Domain-Driven Design (DDD)?

Mejora continua en el desarrollo de working software  

CTA-interesting-justdigital

 

Barcelona
Passeig Gaiolà 13
+34 933 801 144
Lleida
Carrer Agustins 7
+34 973 988 222
Andorra
(Escaldes-Engordany)
Parc de la Mola 10, AD700
Bogota
Carrera 9A #99-07 Piso 9. Despacho 02
Torre la Equidad