16

He buscado un poco para esto e intenté implementar una solución hecha por mí mismo pero hasta ahora no he encontrado que sea seguro.Prueba de integración de JavaScript en Ruby on Rails

Lo que necesito es escribir pruebas de integración en Ruby on Rails que interactúen con JavaScript y obtener formas programáticas para afirmar algunos comportamientos. Estoy usando Test :: Unit para la parte del controlador/modelos, pero estoy luchando para probar algunos comportamientos de jQuery/JavaScript que usa mi aplicación. Principalmente consiste en llamadas e interacciones ajax en la interfaz de usuario que actualiza algunos conjuntos de información.

No he encontrado una solución que me haga sentir seguro y que se integre bien con el autotest y todo el proceso rojo-verde, así que por ahora la mayoría de las partes de mi código del lado del cliente no están probadas y eso me pone nervioso (como debería ser: P).

Entonces, ¿alguien tiene sugerencias sobre las mejores prácticas en este tema? Pruebas unitarias JS es un poco complicado, como señala Crockford, porque depende en gran medida del estado actual de la interfaz de usuario y etc. y como AFAIK incluso él no ha encontrado una buena manera de implementar pruebas decentes ...

En breve : Necesito implementar pruebas para algún comportamiento de UI que dependa de Ajax, integrándome con el autotest o alguna otra herramienta de CI y no he encontrado una forma buena y elegante de hacerlo.

Gracias a todos por la atención, Saludos

Respuesta

3

En abril de 2011, los chicos de 0 0bottom updated their quest para las pruebas de javascript. Akephalos ha caído en desuso por las siguientes razones:

Errores: como se mencionó anteriormente, hay errores en HtmlUnit, específicamente con jQuery en vivo. Aunque todas las implementaciones de navegador tienen errores, es más útil si las pruebas experimentan los mismos errores que los buscadores reales .

Compatibilidad: htmlunit no implementa por completo el conjunto de características que hacen los navegadores modernos. Por ejemplo, no maneja completamente los rangos DOM o las cargas de archivo Ajax .

Representación: htmlunit en realidad no representa la página, por lo que las pruebas de que dependen de la visibilidad de CSS o el posicionamiento no funcionarán.

Rendimiento: cuando la mayoría de sus pruebas utilizan Javascript, las suites de prueba con htmlunit comienzan a rastrear. Lleva un tiempo iniciar una prueba con 0-Akephalos, y un conjunto de pruebas grande puede tomar fácilmente 10 o 15 minutos.

Así que lanzaron su propia solución que es de código abierto - capybara-webkit. Todavía es bastante nuevo, pero parece que es el camino a seguir ahora.

4

yo sepa, fuera de una combinación de Capybara con Selenium Web-Driver hay muy pocas opciones para pruebas automatizadas de código JS. Utilizo pepino con capibara y selenio y debido a que selenio-webdriver realmente lanza firefox o Chrome para probar una página en particular con una llamada ajax, lleva mucho más tiempo ejecutar un conjunto de pruebas.

Existen algunas alternativas pero no funcionan todo el tiempo o para todas las situaciones. Por ejemplo: Capybara with envjs

+0

Gracias por el enlace a Capybara-envjs! ¿Se puede usar eso fuera del mundo de Rails (por ejemplo, en cualquier aplicación web heredada)? –

2

He usado pepino y capibara con selenio. Esto fue muy frustrante porque el selenio no parecía ser capaz de ver javascript dinámicamente generado, a pesar del hecho de que se suponía que el capibara estaría esperándolo. Eso fue en enero de 2011. Las cosas pueden ser diferentes ahora.

Actualmente, estoy usando pepino y capibara con akephalos. Hasta ahora, ha sido muy difícil porque 1. no tiene cabeza, por lo que no puede ver el progreso. La llamada de "save_and_open" de Capybara ha ayudado hasta cierto punto. 2. jQuery y akephalos no parecen jugar muy bien juntos. Por ejemplo, activar un botón de opción con .change() de jquery funciona bien en chrome, pero no en akephalos. Tal vez esto es intencional porque más tarde escuché en alguna parte que no funciona en IE. Solucioné el problema usando .click() en lugar de .change() para el botón de opción, pero como la función .change estaba configurada para ejecutarse en varias preguntas, tuve que codificar específicamente para que funcionara para la prueba. .

La conclusión para mí es que las pruebas automáticas de aceptación de JavaScript en un env de rieles aún son inmaduras y posiblemente tengan más trabajo que lo que valen.