Esto es algo que me preocupa desde hace un tiempo. ¿Realmente vale la pena probar un cliente API?
Digamos que está creando una pequeña clase para abstraer las llamadas a una API REST de la tienda de mascotas. La tienda de mascotas es una API muy simple y tiene un conjunto básico de métodos:
listProducts()
getProductDetails(ProductID)
addProduct(...)
removeProduct(ProductID)
Al probar esto, tendríamos que crear un servicio simulado o simular las respuestas. Pero eso parece excesivo; Entiendo que queremos asegurarnos de que nuestros métodos no dejen de funcionar a través de errores tipográficos / sintácticos, pero dado que estamos escribiendo funciones que llaman métodos remotos y luego estamos creando respuestas falsas de esos métodos remotos, parece que una pérdida de esfuerzo y que estamos probando algo que realmente no puede fallar. Peor aún, si el método remoto cambia, nuestras pruebas unitarias pasarán mientras falla el uso de producción.
Estoy bastante seguro de que me falta algo, o tengo el extremo equivocado del palo, o no veo la madera para los árboles. ¿Alguien puede ponerme en el camino correcto?
fuente
Respuestas:
El trabajo de un cliente API remoto es emitir ciertas llamadas, ni más ni menos. Por lo tanto, su prueba debe verificar que emite esas llamadas, ni más ni menos.
Claro, si el proveedor de API cambia la semántica de sus respuestas, entonces su sistema fallará en la producción. Pero eso no es culpa de su clase de cliente; es algo que solo se puede atrapar en las pruebas de integración. Al confiar en un código que no está bajo su control, ha renunciado a la capacidad de verificar la corrección a través de pruebas internas; fue una compensación, y este es el precio.
Dicho esto, probar una clase que consiste solo en delegaciones a otra clase puede ser de baja prioridad, porque existe un riesgo comparativamente pequeño de errores complejos. Pero eso se aplica a cualquier clase que consista solo en frases uniformes, no tiene nada que ver con llamar al código de otro proveedor.
fuente
foo()
se llama antesbar()
, pero eso no significa que llamarfoo()
antesbar()
sea lo correcto; una prueba unitaria como esa pasaría incluso si el código es incorrecto. Y si eso es todo lo que el cliente está haciendo, configurar los simulacros que verifican sifoo()
se llama antesbar()
es relativamente problemático para algo que puede verificarse con una mirada rápida al código del cliente.add()
método agrega dos números correctamente, pero eso no significa que sumar sea lo correcto en este punto del algoritmo: laadd()
prueba unitaria tendrá éxito aunque su programa esté equivocado. Si es algo incorrecto, entonces sulevenshteinDistance()
método es el culpable, no eladd()
método. Esto es exactamente lo mismo. El punto de tener el código separado en métodos es siempre que cada método solo tiene que preocuparse por obtener una cosa correcta.Respuesta corta:
Todos los métodos deben ser probados en unidades.
Respuesta larga:
Sí. Vale la pena.
Estas son algunas cosas que las pruebas unitarias en esos métodos de llamada a la API deben probar:
Esas son las cosas que hace el método llamado que pueden aislarse de mi burlarse del servicio API, y que al probarlas bien, le aseguramos que los errores no se originan por un error en el código del cliente que llama a la API.
fuente
Estas no serían pruebas unitarias porque está probando la entrada y salida de su sistema, más como pruebas de integración limitadas.
Sea muy cauteloso cuando diga "parece una pérdida de esfuerzo y estamos probando algo que realmente no puede fallar" : puede fallar, fallará, probablemente fallará de una manera que no puede anticipar, el las fallas serán peores si no tiene pruebas establecidas.
El error que está cometiendo aquí tiene que ver con la invención de las ruedas: hacer llamadas a servicios remotos y API es un escenario muy común, por lo que hay algunas herramientas bastante buenas para ayudarlo a probar eso. La última vez que estaba trabajando en una aplicación que se conectaba a servicios remotos, utilicé SoapUIque podría ver un servicio y realizar llamadas simuladas a ese servicio o comportarse como una copia local del servidor con el que puede realizar llamadas de prueba y realizar un seguimiento de las solicitudes y respuestas. La instalación tardó unos minutos y, de la misma manera, la actualización remota fue muy rápida. No lo he usado en un escenario REST, pero incluso si no funciona bien para eso (o tal vez alguien esté leyendo esta respuesta en el futuro cuando existan mejores herramientas), debería poder encontrar una herramienta que pueda simularse un servicio para usted y cuando llegue el momento de implementar su código, se alegrará de haberlo hecho.
fuente