¿Cómo pruebo un sitio web de formularios?

26

¿Cómo pruebo un sitio web de formularios? Me parece que, en gran medida, depende del estado y la entrada del usuario, no sería factible.

Si no es factible, ¿existe una alternativa automática válida?

Tom Squires
fuente
2
Si desea realizar pruebas automatizadas de la interfaz de usuario, necesitará algo como Selenium. Pero, si desea pruebas unitarias automatizadas , entonces no necesita selenio. Solo necesita los patrones correctos en su lugar. Mira mi respuesta.
Matthew Rodatus

Respuestas:

22

Sí tu puedes. Solo debes tener cuidado de separar bien tus preocupaciones. En resumen, debe eliminar toda su lógica del código subyacente y colocarla en otras clases.

Hay dos formas comunes de hacer esto.

La manera simple es repensar todos los controladores de eventos en términos de "¿Qué información me proporciona el sistema? ¿Qué información necesito completar en la página?" y luego proporciona una clase de servicio que realiza esa conversión.

En este caso, la capa de servicio debe saber muy poco sobre la naturaleza de su capa de presentación. Todavía tiene que tomar los datos devueltos por el servicio y completar los componentes correctos del WebForm en su código subyacente y esto permanece sin probar (al menos por pruebas unitarias, aún puede emplear pruebas de integración). Pero esto rara vez es donde el código sale mal, es mucho más probable que falle en la lógica.

Una forma más complicada, pero más efectiva, es usar el patrón Presentador de vista de modelo . Cuando lo intentamos, descubrimos que los presentadores rápidamente se unieron mucho al marco y, cuanto más desarrollamos MVP, más claro era que MVP realmente quería ser MVC pero no podía serlo.

Dicho esto, otros lo han hecho con mucho éxito, incluso hay un marco webformsmvp disponible para eliminar el trabajo pesado, por lo que su kilometraje puede variar.

pdr
fuente
1
@ jmoreno: ¡Buena captura! He olvidado que WebForms y MVP incluso existen en los últimos 5 años.
pdr
16

Obviamente, toda una página de formularios web no es una unidad y, por lo tanto, no puede probarse de forma unitaria. Sin embargo, hay algunas cosas que puede hacer para las pruebas automatizadas:

  • prueba unitaria de componentes individuales de la página (cualquier método que realice una lógica real)
  • componentes de prueba unitaria utilizados por la página (controles personalizados, lógica empresarial subyacente, etc.)
  • pruebas de funcionalidad automatizadas (mediante el control remoto de un navegador o el envío de solicitudes HTTP a través de algo como cURL)
  • pruebas de penetración automatizadas (existen herramientas que intentarán encontrar posibles puntos de inyección y ejecutarán automáticamente ataques de inyección inofensivos pero detectables en su página)
  • Prueba de carga
  • verificar el diseño con una lista de usabilidad y viñetas estilo casa (aunque esto es muy difícil de automatizar; generalmente es más factible hacerlo manualmente de vez en cuando)
tdammers
fuente
-1 Lo siento, pero las pruebas de carga, las pruebas de penetración y la verificación del diseño no tienen nada que ver con las pruebas unitarias
Tom Squires
2
@TomSquires: por supuesto que no, y si lees mi respuesta cuidadosamente, notarás que nunca dije que sí. Pero la pregunta parece confundir los conceptos de pruebas unitarias y pruebas automatizadas en general, por lo que enumeré varias pruebas automatizadas significativas que puede lanzar en un formulario web.
tdammers
De acuerdo, probar una página web es más probable que sea una forma de prueba de integración que una prueba unitaria por definiciones estrictas, aunque todavía es bueno automatizar todo lo que pueda
jk.
66
@TomSquires: downvote totalmente injustificado. Su propia pregunta comienza con la prueba de un sitio completo, que no tiene nada que ver con las pruebas unitarias. Tdammers identificó varias formas de probar el todo y las partes e identificó dónde
encajan las
3
Lo suficientemente justo. Lo retiro
Tom Squires
9

Lamento haber perdido la parte de la "unidad" de la pregunta ...

SeleniumHQ es tu amigo para las pruebas desde el frente. No es una prueba unitaria, más como una prueba de caja negra. Todavía necesita pensar en casos de prueba válidos ...

WarrenFe
fuente
1
Su respuesta surgió cuando presioné "publicar su respuesta" para decir exactamente lo mismo.
Yannis
2
Además, dado que op está preguntando acerca de las pruebas unitarias, agreguemos que la pregunta sobre la que realmente se trata es la prueba funcional (ity) , que es más apropiada (sensible, factible) cuando se prueban los elementos de entrada del usuario.
Yannis
+1 porque sigo queriendo usarlo, pero nunca me puse a ello. ¿Alguien lo ha usado, es bueno y vale la pena implementarlo?
NimChimpsky
66
El selenio es una herramienta fantástica, pero no tiene nada que ver con las pruebas unitarias.
pdr
Es cierto, parece que omití esta información en la pregunta: /
WarrenFaith
6

Hablando por experiencia: solo si se hace bien. Por "correcto" me refiero a un mínimo de código subyacente y algo así como el Modelo-Vista-Presentador mencionado anteriormente para hacer que el formulario web sea "tonto". Por lo general, esto resulta muy difícil con las aplicaciones brownfield porque no fueron diseñadas teniendo esto en cuenta y es un esfuerzo casi hercúleo refactorizar / reescribir páginas para usarlo.

Wayne Molina
fuente
1

watin

Creo que las pruebas web unitarias son extremadamente útiles, incluso si es solo para dar una idea general de un error de regresión o para nuevos proyectos.

En lo que respecta al estado, puede crear sus pruebas unitarias como lo haría con las pruebas que no son de interfaz de usuario: borran la base de datos al comienzo de la prueba y reconstruyen la base de datos para que no contenga nada excepto el estado de inicio. Cada prueba unitaria encapsula una sola página, o generalmente una tarea distinta en una página.

http://watin.org/ es otra herramienta de prueba web pero para C # /. NET. Escribe las pruebas como pruebas unitarias:

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

Actualmente está basado en IE pero tiene algún soporte experimental para Firefox y Chrome. Puede automatizar prácticamente cualquier cosa que haría en las pruebas manuales, incluida la interacción con Javascript.

Chris S
fuente
Ack que es 2016. La visita de hoy al sitio de WatiN me indica que WatiN tal vez está muerto. Los documentos son escasos, no están actualizados y los videos no se reproducen. Estoy no quejando - Tengo un gran agradecimiento por instrumentos voluntarios de código abierto - este comentario es ayudar a otras personas venir-últimamente como yo. La respuesta está bien, solo señalando que comenzar puede requerir un aprendizaje práctico autónomo.
qxotk
1
Ayuda adicional para cualquiera que piense en la forma de WatiN, confirmación está estancada + dónde buscar en el presente aquí: stackoverflow.com/questions/118531/…
qxotk
0

Realmente no puede probar un sitio web de forma unitaria, simplemente porque las solicitudes web se realizan por cable (o a través de una pila TCP). Por lo tanto, las pruebas no se ajustan a la definición de "prueba unitaria", probablemente serían pruebas de extremo a extremo.

Para ese tipo de pruebas, puede usar una suite como Selenium que ejecuta un navegador web detrás de escena. Sin embargo, una advertencia: por lo general, este tipo de prueba es muy difícil e impredecible, ya que hay muchas partes móviles.

Sin embargo, lo que es más interesante, me preocupa un poco por qué necesitaría probar formularios web. ¿No está poniendo demasiada lógica en el código y tiene una lógica comercial anémica por casualidad?

Sklivvz
fuente
-1

Jazmín

En los últimos 5 años, Jasmine se ha convertido en una herramienta clave para las pruebas de unidades frontales. A menudo se incorpora a las pruebas de compilación automática con Node y npm

Por https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework) :

Jasmine es un marco de prueba de código abierto para JavaScript. [2] Su objetivo es ejecutarse en cualquier plataforma habilitada para JavaScript, no interferir en la aplicación ni en el IDE, y tener una sintaxis fácil de leer. Está fuertemente influenciado por otros marcos de pruebas unitarias, como ScrewUnit, JSSpec, JSpec y RSpec. [3]

A pesar de todas las menciones de javascript, también se puede usar para pruebas unitarias de un formulario web simple.

Michael Durrant
fuente
Si bien JavaScript se usa en formularios web, no es el método principal para actualizar la interfaz de usuario
Tom Squires
Cierto. Sin embargo, la alternativa es ...? Es por eso que, aunque no está destinada a ese fin, Jasmine funciona muy bien. Además, la sintaxis es casi idéntica a RSpec, que aman los programadores de Ruby.
Michael Durrant
-2

ASP.NET

Al desarrollar un sitio ASP.NET pudimos ejecutar pruebas unitarias en:

  • El dominio
  • Controladores / presentadores BL
  • el código detrás de las páginas de formularios web

Es posible TDD todo esto, dependiendo de su arquitectura. Lo único que no puede hacer una prueba unitaria es el diseño del archivo de marcado.

KeithS
fuente
3
Esta respuesta dice "sí, es posible" a la pregunta de "cómo". No exactamente útil.
RubberDuck