unitarios unitarias unit test pruebas integracion hacer como javascript node.js angularjs testing protractor

javascript - unitarias - test unitarios angular 5



Cómo hacer pruebas de integración para aplicaciones web(Angularjs) (5)

Estoy desarrollando una Webapp. Consiste en 2 partes. Un servidor de reposo de nodo y un cliente angularjs.

La aplicación está estructurada de esta manera: Rest Server <-> Api Module <-> Angular App

El servidor está actualmente bien probado. Tengo pruebas unitarias y pruebas de integración. Las pruebas de integración acceden a una base de datos real y llaman a la API de repos sobre http. Creo que este es el nivel más alto que se puede obtener para las pruebas de servidor. Las pruebas de integración también se ejecutan rápidamente. Estoy bastante seguro de que la forma en que probé el servidor es suficiente para mi caso de uso y estoy contento con los resultados.

Sin embargo, estoy luchando para probar la aplicación angularjs. Tengo pruebas unitarias para las directivas y módulos pertinentes. Escribir esto no fue un problema.

Me gustaría escribir pruebas de integración que cubran escenarios de usuario. Algo así como un escenario de suscripción: el usuario visita el sitio web, va al formulario de inscripción y envía el formulario con los datos.

El equipo angularjs se está moviendo desde ng-scenarios a protractor . El transportador está usando Selenium para ejecutar las pruebas. Por lo tanto, hay dos ámbitos: el alcance de la aplicación y el alcance de la prueba.

Ahora puedo pensar en tres abstracciones diferentes que podría usar. Y no estoy seguro de cuál me queda mejor.

  • Burlarse del Módulo Api
  • Simula el resto del servidor
  • Usa el servidor completo

Burlarse del Módulo Api

En este caso, no necesitaría configurar un servidor. Todas las interacciones se ejecutan en el navegador

Ventaja:

  • No se necesita servidor

Desventaja:

  • La API está en el alcance del navegador y tengo que manipular esto.

Realmente me gusta esta solución, pero me resulta difícil burlarme del Api. La API debe modificarse en el alcance de los navegadores. Por lo tanto, debo enviar la modificación de la prueba al navegador. Esto se puede hacer , sin embargo, no veo cómo podría ejecutar afirmaciones como mockedApi.method.wasCalledOnce() en el alcance de las pruebas

Simula el resto del servidor

Ventaja:

  • El cliente no cambiaría
  • Solo un alcance para tratar

Desventaja:

  • Uno tiene que configurar las Rutas de Descanso

Podría crear un servidor de descanso simulado completo en nodejs. Las pruebas de transportador están escritas en nodejs, por lo que el control del servidor se puede realizar en la prueba. Antes de ejecutar la prueba, puedo decirle al servidor cómo responder. Algo como esto: server.onRequest({method: ''GET'', url: ''/''}).respondWith(''hello world'')

Entonces podría hacer afirmaciones como wasCalledOnce

Use el servidor completo con base de datos

Cada prueba se ejecuta con un servidor completo y puede agregar elementos a la base de datos. Después de cada prueba, uno puede ver los elementos esperados en la base de datos

Ventaja:

  • Puede estar bastante seguro de que si estas pruebas se están ejecutando, la aplicación es funcional en el caso de uso probado

Desventaja:

  • Ya hice una prueba de integración bastante intensa con el servidor de descanso. Esto se siente como hacer lo mismo otra vez.
  • La instalación depende del servidor completo

Conclusión actual

  • Burlarse de la API separaría por completo al servidor y al cliente.
  • Usar un Mock Api sería una prueba de nivel superior, pero requeriría un servidor falso
  • Hacer una prueba de integración completa daría la mejor confiabilidad, pero esto también depende en gran medida del código del servidor

¿Qué debería elegir? ¿Qué harías?


Aquí hay un enfoque para escribir pruebas de integración para su código angular. El concepto clave es estructurar su código de una manera que le permita invocar las distintas funciones de forma muy similar a cómo la UI lo consume. Desvincular adecuadamente su código es importante para tener éxito en esto:

Más aquí: http://www.syntaxsuccess.com/viewarticle/angular-integration-tests


Burlarse del servidor REST es, en mi opinión, la mejor y más limpia opción. Pruebe Mountebank ( http://www.mbtest.org ). Una increíble herramienta de servicio de virtualización.


Creo que respondí esta misma pregunta en el grupo de Google Protractor. Tengo la misma opinión que usted acerca de no querer ningún servidor, pero querer que todo mi código de prueba esté en un solo lugar (en el transportador) y no dividirlo entre Transportador y el navegador. Para habilitar esto, tomé el asunto en mis propias manos y desarrollé un proxy para el servicio $ httpBackend que se ejecuta dentro de Protractor. Permite configurar el servicio $ httpBackend como si se estuviera ejecutando en Transportador. He estado trabajando en ello desde hace un tiempo y está bastante completo en este momento. Sería genial si pudieras echar un vistazo y decirme si me estoy perdiendo algo importante.

https://github.com/kbaltrinic/http-backend-proxy


Es una pregunta excelente, que no tiene nada que ver con una herramienta en particular. Tuve que enfrentar el mismo problema en un gran proyecto "greenfield" (es decir, empecé desde cero).

Aquí hay un problema de vocabulario: la palabra "simulacro" se usa en todas partes, y lo que usted llama "prueba de integración" son más "pruebas funcionales automatizadas completas de extremo a extremo". Sin ofender aquí, es solo que una redacción clara ayudará a resolver el problema.

De hecho, usted mismo sugirió la respuesta correcta: # 2 stub the rest server. # 1 es aceptable, pero pronto será demasiado difícil de desarrollar y mantener. # 3 es una excelente idea, pero no tiene nada que ver con la prueba de IU y la validación de la IU.

Para lograr una alta confiabilidad de su front-end, independientemente de su backend, solo resida el servidor de reposo, es decir, desarrolle un servidor REST simple y estúpido que será idempotente, es decir, SIEMPRE responderá lo mismo a una solicitud HTTP. Mantener el principio de idempotencia hará que el desarrollo y la prueba sean muy, muy, más fáciles que cualquier otra opción.

Luego, para una prueba, solo verifica lo que se muestra en la pantalla (prueba la parte superior) y lo que se envía al servidor (prueba la parte inferior), de modo que toda la pila de UI se prueba una sola vez.

La respuesta completa a la pregunta debería merecer un artículo de blog completo, pero espero que pueda sentir qué hacer con lo que sugiero.

Atentamente


Esta es una gran pregunta. Así es como lo haría:

Como ya tiene las pruebas de unidades angulares para las directivas y módulos relevantes, esto es perfecto.

La otra cosa que es perfecta es que las pruebas de integración de su servidor están accediendo a una base de datos real y también se están asegurando de que funcione la API de repos sobre http.

Entonces, ¿por qué no agregar algunas pruebas de integración de alto nivel que incluyen angular y su servidor al mismo tiempo?

Si puede evitar la burla, por qué no guardar el trabajo para mantener el código adicional, si es posible.

También una buena lectura: http://blog.ericbmerritt.com/2014/03/25/mocking-is-evil.html