2009-06-03 10 views
8

Recientemente he surgido la pregunta: ¿vale la pena dedicar tiempo de desarrollo para generar pruebas automáticas de unidades para proyectos basados ​​en web? Quiero decir que parece inútil en algún momento porque en algún momento esos proyectos están orientados a las interacciones con usuarios/clientes, por lo que no puede prever todo el conjunto posible de acciones del usuario para que pueda verificar la exactitud del contenido mostrado. Incluso la prueba de regresión difícilmente puede hacerse.
Estoy ansioso por saber la opinión de otros desarrolladores experimentados.Pruebas automáticas para proyectos basados ​​en la web

Respuesta

2

No se puede anticipar la totalidad posible conjunto de la acción del usuario para que sea capaz de verificar la exactitud de demostrado contenido.

No puede anticipar todos los datos posibles que le entregarán su código, o todas las condiciones de carrera posibles si están enhebrados, y aún así le molestan las pruebas unitarias. ¿Por qué? Porque puedes reducirlo muchísimo. Puedes anticipar el tipo de cosas patológicas que sucederán. Solo tienes que pensar un poco y obtener algo de experiencia.

La interacción del usuario no es diferente. Hay ciertas cosas que los usuarios intentarán y harán, patológicas o no, y pueden preverlas. Los usuarios solo están ingresando datos particularmente imaginativos. Encontrará que los programadores tienden a perder el mismo tipo de condiciones una y otra vez. Guardo una lista de verificación. Por ejemplo: bombee Unicode a todo; poner la fecha de inicio después de la fecha de finalización; ingrese datos de galimatías; poner etiquetas en todo; dejar fuera de la línea nueva; intente ingresar los mismos datos dos veces; envíe un formulario, regrese y vuelva a enviarlo; toma un archivo de texto, llámalo foo.jpg e intenta subirlo como una imagen. Incluso puede escribir un programa para activar interruptores y botones al azar, un mono malo, que encontrará todo tipo de errores divertidos.

Suele ser tan simple como sentar a alguien que no está familiarizado con el software y ver cómo lo usa. Combate el impulso de corregirlos, solo míralos flotar. Es muy educativo. Steve Krug se refiere a esto como "Advanced Common Sense" y tiene un excelente libro llamado "No me hagas pensar", que cubre las pruebas de interacción con el usuario simples y baratas. Lo recomiendo altamente. Es una lectura muy breve y reveladora.

Finalmente, el cliente mismo, si sus expectativas están preparadas adecuadamente, puede ser un fantástico conjunto de pruebas. Asegúrese de que entiendan que es un trabajo en progreso, que tendrá errores, que están ayudando a mejorar sus productos, y que no debe usarse para datos de producción, y les permite jugar con las versiones preliminares de tu producto. ¡Hacen todo tipo de cosas en las que nunca pensaste! Serán las mejores y más realistas pruebas que jamás haya tenido, ¡GRATIS! Bríndeles una forma muy sencilla de informar errores, preferentemente solo un botón en la aplicación que envía automáticamente su entorno e historial; el cuadro de comentarios en Hiveminder es un excelente ejemplo. Responde a sus errores de forma rápida y educada (incluso si es solo "gracias por la información") y descubrirás que estarán encantados de que seas tan sensible a sus necesidades.

2

Sí, lo es. Me encontré con un problema esta semana con un sitio web en el que estoy trabajando. Recientemente cambié la capa de acceso a datos y establecí pruebas de unidad para mis controladores y repositorios, pero no las interacciones de UI.

Me puse un error bastante obvio que hubiera sido capturado fácilmente si tuviera pruebas de integración. Solo a través de las pruebas de integración y las pruebas de funcionalidad de la interfaz de usuario encuentra problemas con la forma en que los diferentes niveles de la aplicación interactúan entre sí.

+0

I segundo esto. No verá el valor hasta que salve su trasero. Entonces te preguntarás cómo dormiste por la noche sin eso. :) – cwash

+0

Bien, pero ¿qué quiere decir con la prueba de integración? ¿Como lo harias? –

+0

Una prueba de integración prueba la funcionalidad de extremo a extremo. Las pruebas de unidad normal solo prueban la función/método que desea probar, nada más. Por ejemplo, para probar un método en la lógica de su negocio que obtiene una lista de clientes de una base de datos, podría falsificar la base de datos. Una prueba de integración, sin embargo, iría hasta la base de datos y viceversa, para probar cómo funciona todo junto. Lo mismo en una página web. Con WATIN o Selenium, puede acceder a la página web que desea probar y asegurarse de que los datos se devuelvan correctamente, etc. La prueba aplicará todos los niveles de su código. – Doanair

2

Si estás escribiendo un montón de Javascript, ha habido una gran cantidad de marcos de pruebas de JS que han llegado recientemente a la manzana para la unidad de pruebas de su Javascript.

Aparte de eso, probar el nivel web usando algo como Canoo, HtmlUnit, Selenium, etc. es más una prueba funcional o de integración que una prueba unitaria. Estos pueden ser difíciles de mantener si la UI cambia mucho, pero pueden ser útiles. La grabación de pruebas de selenio es fácil y es probable que otras personas (evaluadores) puedan ayudarlo a crear y mantener. Simplemente sepa que hay un costo asociado con el mantenimiento de las pruebas, y debe equilibrarse.

Existen otros tipos de pruebas que son geniales para el nivel web, especialmente las pruebas de fuzz, pero muchas de las buenas opciones son herramientas comerciales. Uno que es de código abierto y se conecta a Rails se llama Tarantula. Tener algo así en el nivel web es bueno haber corrido en un proceso de integración continuo y no requiere mucho en forma de mantenimiento.

+0

¿Puede asesorar al marco de prueba de JS que no sea Firebug? –

+0

Depende de lo que esté haciendo. Hay algunas estructuras de estilo BDD ahora si está poniendo muchas reglas/funciones en Javascript personalizado. ScrewUnit es uno con el que he jugado antes. FireUnit está integrado Firebug y funciona bien para las pruebas generales. No es bueno para automatizar o ejecutar de forma continua, howev er. JSUnit es un buen propósito general. Si está utilizando Prototype, consulte unittest.js desde Script.aculo.us y si está utilizando JQuery, busque en QUnit. – cwash

+0

También hay Test.Simple. Simplemente lo conecté junto con Selenium para que pueda ser automatizado e interpretado desde la línea de comando, de modo que puedan ser probados de manera automática. http://use.perl.org/~schwern/journal/39088 – Schwern

2

Realmente depende de la estructura y la arquitectura de su aplicación web. Si contiene una capa de lógica de aplicación, entonces esa capa debería ser fácil de probar con herramientas de automatización como Visual Studio. Además, el uso de un marco que ha sido diseñado para permitir pruebas unitarias, como ASP.NET MVC, ayuda mucho.

+0

Correcto, pero no estoy hablando de la capa de lógica de aplicación. Cada unidad en la capa de aplicación es fácil de probar, pero su integración en el cliente/navegador es algo más complicado y parece inútil pasar tiempo para cubrir el 5-10% de todas las posibilidades.Parece más común desarrollar escenarios de usuario y probar en consecuencia. –

1

Las pruebas unitarias tienen sentido en el proceso TDD. No tienen mucho valor si no haces el desarrollo de prueba primero. Sin embargo, la prueba de aceptación es una gran cosa para la calidad del software. Yo diría que la prueba de aceptación es un santo grial del desarrollo. Las pruebas de aceptación muestran si la aplicación cumple con los requisitos. ¿Cómo puedo saber cuándo dejar de desarrollar la función, solo cuando pase toda mi prueba de aceptación? La automatización de las pruebas de aceptación es muy importante porque no tengo que hacerlo todo de manera manual cada vez que realizo cambios en la aplicación. Después de meses de desarrollo, puede haber cientos de pruebas y se hace inviable (en algún momento imposible) ejecutar todas las pruebas de forma manual. Entonces, ¿cómo sé si mi aplicación todavía funciona?

La automatización de las pruebas de aceptación se puede implementar con el uso de marcos de prueba xUnit, lo que genera confusión aquí. Si creo una prueba de aceptación usando phpUnit o httpUnit, ¿es una prueba unitaria?Mi respuesta es no. No importa qué herramienta utilizo para crear y ejecutar la prueba. La prueba de aceptación es la que muestra si las características funcionan según los requisitos de IAW. La prueba de unidad muestra si una clase (o función) satisface la idea de implementación del desarrollador. La prueba unitaria no tiene valor para el cliente (usuario). prueba de aceptación tiene un gran valor para el cliente (y por lo tanto al desarrollador, recuerde Customer Affinity)

Así que recomiendo la creación de la aceptación automatizado prueba para la aplicación web.

Los buenos marcos para la prueba de aceptación son:

  • Sahi (sahi.co.in)
  • Silenium
  • SimpleTest (I't un marco-test unidad para php, pero incluye la objeto del navegador que se puede usar para las pruebas de aceptación).

Sin embargo

Se han mencionado que sitio web tiene que ver con la interacción del usuario y por lo tanto la automatización de pruebas no va a resolver todo el problema de usabilidad. Por ejemplo: el marco de prueba muestra que todas las pruebas pasan, sin embargo, el usuario no puede ver el formulario o enlace u otro elemento de página debido a style="display:none" accidental en el div. Las pruebas automáticas pasan porque el div está presente en el documento y el marco de prueba puede "verlo". Pero el usuario no puede. Y la prueba manual fallaría.

Por lo tanto, todas las aplicaciones web necesitan pruebas manuales. La prueba automatizada puede reducir drásticamente la carga de trabajo de la prueba (80%), pero la prueba manual también es importante para la calidad del software resultante.

En cuanto a la prueba de unidad y TDD, hace que la calidad del código. Es beneficioso para los desarrolladores y para el futuro del proyecto (es decir, para proyectos de más de un par de meses). Sin embargo, TDD requiere habilidad. Si tienes la habilidad, úsala. Si no considera adquirir la habilidad, pero tenga en cuenta el tiempo que le llevará ganar. Por lo general, toma de 3 a 6 meses para comenzar a crear un buen examen y código de unidad. Si el proyecto durará más de un año, recomiendo estudiar TDD e invertir tiempo en un entorno de desarrollo adecuado.

+0

Tengo que estar en desacuerdo con la afirmación sobre la prueba unitaria que tiene sentido en el proceso TDD. La prueba de unidad siempre tiene sentido por muchas razones. –

0

He creado una solución de prueba web (docker + pepino); es muy básico y simple, tan fácil de entender y modificar/mejorar. Se encuentra en el directorio web;

mi solución: https://github.com/gyulaweber/hosting_tests

+0

Lamentablemente, no tengo la reputación suficiente para pegar aquí las referencias, por lo que puede verlas en github README. – GyulaWeber

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

+0

Tiene razón, pero es un código de ejemplo, no sé cómo compartirlo sin vincular github u otra página donde se puede acceder al código. Creo que es más fácil comenzar con un ejemplo listo para probar. ¿Qué sugieres, debería escribir los puntos clave de la solución y dar este código como ejemplo? – GyulaWeber

Cuestiones relacionadas