Así es como prueba las API externas en Elixir con bypass

$config[ads_kvadrat] not found

лучший расслабляющий аквариум в 4K UHD ? Anti-Stress Music, Relax and Meditation.

лучший расслабляющий аквариум в 4K UHD ? Anti-Stress Music, Relax and Meditation.

Tabla de contenido:

Anonim

Priorizamos los principios de la Arquitectura Orientada a Servicios en Inverso. Eso significa que tenemos componentes pequeños y mantenibles con responsabilidades claramente definidas. Se comunican entre sí (en su mayoría), a través de Representational State Transfer, o REST, API.

Esto proporciona flexibilidad y nos ha servido bien con la excepción de una faceta importante: la prueba. Al probar, uno debe evitar:

  • Dependencia de servicios externos que se ejecutan en la misma máquina.
  • Pruebas lentas.

Debido a que las aplicaciones dependen de los servicios externos, es fundamental contar con una estrategia de prueba para esas dependencias.

Hace poco comenzamos a usar Bypass y explicaré cómo llegamos allí y, específicamente, cómo lo estamos utilizando.

El pasado

Métodos simulados y devolver algunos datos de ejemplo como este:

Ese fue (y creo que todavía es) el "camino a seguir" en el mundo de Ruby / Rails. Desafortunadamente, esto fomenta el mal comportamiento, tal como lo explica mejor aquí José Valim.

Luego, comenzamos a utilizar ExVCR, que es una gran biblioteca, pero tiene inconvenientes similares a los simulacros / resguardos: fomenta la pereza y no fomenta la separación de preocupaciones que son críticas para APIs bien definidas. ExVCR permite a uno "grabar" y "reproducir" datos en tiempo real. Es muy fácil de integrar (incluyendo algunas líneas en su prueba y todo lo demás está a cargo). Pero lo ideal es tener que pensar en las dependencias externas en las pruebas, no en abstraerlas. Puede que aún sea una opción viable para los escenarios en los que el comportamiento del punto final se debe probar con una sobrecarga mínima (lo usamos para probar las llamadas a los Servicios de AWS de Amazon como S3).

Introducir adaptadores

Los adaptadores funcionan muy bien y promueven la deliberación en torno a los contratos API y los límites de comunicación claramente definidos. Todavía utilizamos este enfoque, especialmente cuando el adaptador es más complejo (como un zócalo JSON-RPC).

Así es como podría verse un adaptador:

Pero para los puntos finales HTTP simples, los adaptadores parecen mucho trabajo y tienen un gran inconveniente: dejan las bibliotecas que consumen fuera de la ecuación de prueba. Si cambia algo en las bibliotecas HTTP o JSON, las pruebas no lo detectarán. La cantidad de código crítico de producción que no se ha probado con este enfoque es inaceptable.

El presente y el futuro

La derivación nos permite iniciar un servidor web muy simple en las pruebas que simulan los servicios externos que utilizamos.

Ahora, podemos probar la pila completa, incluida la biblioteca HTTP, la biblioteca de codificación / decodificación JSON y los mecanismos de autenticación. El Bypass README está bien escrito, por lo que guardaré los detalles de la implementación. Sin embargo, sí cambiamos ligeramente la forma en que lo usamos para mantener las pruebas concisas y legibles:

En primer lugar, a veces queremos llamar a Facebook cuando las pruebas se ejecutan como una suite de integración completa. Hacemos esto de manera irregular para garantizar que la API de Facebook aún funcione según nuestras expectativas. Añadiendo --incluir la integración a prueba de mezcla no simula la API sino que, en cambio, llama al servicio externo (líneas 5, 7).

Somos explícitos cuando simulamos solicitudes a servicios externos, de modo que cada prueba que utiliza Bypass debe tener la @tag facebook_bypass (línea 7).

Finalmente, el manejar_fb La función (líneas 30-39) está siendo llamada (dado que la request_path partidos). Me gusta hacer coincidir en el cabezal de función, ya que hace explícito a qué ruta estamos reaccionando y nos permite definir diferentes funciones para diferentes rutas.

Por lo tanto, Bypass se ejecuta solo en pruebas etiquetadas con @tag: bypass y cuando no estamos ejecutando nuestra suite de integración. Una cosa más que hacemos al configurar Bypass es permitir que la etiqueta pase una identificación de página (líneas 8, 20). Así que aquí está cómo se ve una prueba que usa Bypass en todo su esplendor:

Como puedes ver, la facebook_bypass La etiqueta hace explícito que estamos simulando la API (a menos que estemos en modo de integración). Nos permite pasar información a la API simulada, y es muy fácil reutilizar la misma configuración de Bypass para diferentes pruebas.

Espero que esto te ayude a probar APIs externas. Puedes encontrarme en Twitter (ver más abajo) si tienes más preguntas.

$config[ads_kvadrat] not found