Muchas veces durante la automatización de casos de prueba nos podemos encontrar con la necesidad de probar apis de forma automatizada, algo que vaya más allá de lo funcional dentro de una UI. Para ello tenemos que ingeniarnos para solucionar problemas a los que no estamos acostumbrados. Una de estas situaciones es cuando queremos validar una llamada a un servicio que realiza nuestra aplicación, pero de la cual no tenemos ninguna referencia visual en la UI.
Parece complejo pero es más común de lo que pensamos, ya que las apps envían muchas información en background que el usuario no ve, por ejemplo, datos de ubicación de usuario, datos de uso de la aplicación, datos para analytics sobre ciertas actividades del usuario, etc.
Si te interesa aprender a probar apis, te invito a unirte al grupo Testing Automatizado en facebook.
Como prober APIs
Supongamos que el sistema bajo prueba lleva un tracking de las acciones de cada usuario para analizar la información y saber datos como cuantos usuarios ven un producto, cuantas paginas recorre el usuario dentro de la aplicacion antes de comprar, o, algo muy importante, cuantos usuarios cancelan una compra en la pantalla de checkout.
En el ejemplo anterior, vamos a suponer que ya contamos con un caso de prueba automatizado en selenium webdriver (en caso de no tener experiencia recomiendo el post sobre como automatizar pruebas de software) que consta de un end to end desde el login a la aplicación, el agregar artículos al carro de compras, ir a la pantalla de compra y vaciar el carro a ultimo momento. Esta última acción es en la que quiero centrarme, cuando un usuario vacía el carro de compras se envía un llamado a una api, entonces supongamos que la api es http://unaurlcualquiera.com?accion=XYX donde XYZ son valores como “login”, “agregarProducto”, “comprar”, “vaciarCarro”, etc, y que “vaciarCarro” es el valor que se envía a la API cuando la persona vacía el carrito de compra, justamente la llamada que queremos validar que ocurra al momento de que nuestro test automatizado con selenium realiza la acción de vaciar el carro de compra.
Para poder hacer esto y probar apis, vamos a tener que encontrar una manera de saber que llamadas se están haciendo mientras se ejecuta nuestro test automatizado, algo que va más allá de los limites de selenium webdriver o appium, por lo tanto vamos a tener que usar una herramienta que sepa, o sea un proxy.
Personalmente trabajo con un proxy open source, llamado mitmproxy, que cuenta con la versatilidad de escribir scripts en python para hacer lo que queramos con un request, esto nos permite por ejemplo analizar cada request para entender si es el tipo de request que necesitamos y en caso de que lo sea, enviar la información al framework de automation con la llamada al request.
Para ello creamos un script en python de la siguiente manera:
from urllib import parse import json from mitmproxy import ctx from mitmproxy import http from urllib.parse import unquote import re def response(flow): if "http://unaurlcualquiera.com?accion=" in flow.request.pretty_url: a = flow.request.get_text() a = "http://unaurlcualquiera.com + a values = parse.parse_qs(parse.urlsplit(a).query) if "accion" in values: jsonString = json.dumps(values) text_file = open("/output.json", "a") text_file.write(jsonString) text_file.close()
Listo, de esta manera tenemos un script que captura el trafico, determina si se hizo una llamada a http://unaurlcualquiera.com?accion= y en caso de que se haya hecho, obtiene la query, la convierte a json y la guarda en un archivo output.json.
Para que esto funcione, tenemos que conectar el navegador o celular a este proxy, para ello iniciamos el proxy pasandole como parametro el script que creamos:
mitmdump -s script.py
Una vez iniciado el proxy, apuntamos el device a la direccion y puerto brindada.
Listo, ya podemos desde nuestros casos de prueba, en todo momento consultar el archivo output.json donde estaran las llamadas con sus respectivos valores, a modo de poder validar lo que queramos, por ejemplo, que luego de presionar vaciar carro en la pantalla de checkout, se llame a la api con “accion=vaciarCarro”
Para conocer mas sobre este proxy, les recomiendo leer la documentacion donde se explica muy bien como interceptar queries y realizar acciones sobre ellas.