2009-03-23 11 views
5

Simplemente googleando 'TDD' y 'GWT' conducen fácilmente a this article donde el autor explica cómo puede probar una aplicación GWT sin un contenedor. Sin embargo, creo que su ejemplo no está basado en pruebas, ya que tiene todo el diseño primero y luego escribe la prueba después, no "prueba primero".¿Cómo pruebo el desarrollo de GWT?

Esto me lleva a pensar: ¿es posible tener un desarrollo de "prueba primero" en una interfaz de usuario como GWT? Algunas personas dijeron que el código de UI no es adecuado para TDD. Pero creo que al adoptar el patrón MVC, tal vez al menos podamos probar la parte MC. (Entonces V es la parte UI que no se puede desarrollar mediante prueba).

¿Cuál será la primera prueba de falla que escribiríamos en el ejemplo del artículo?

Respuesta

14

La IU de conducción de prueba es problemática porque a menudo no sabe lo que quiere en la pantalla hasta que lo ve en la pantalla. Por esa razón, el desarrollo de la GUI tiende a ser masivamente iterativo y, por lo tanto, muy difícil de manejar con las pruebas.

Esto no significa que simplemente abandonemos TDD para GUI. Más bien, sacamos la mayor cantidad de código posible de la GUI, dejando solo un simple código de cableado. Ese cableado nos permite hacer los cambios masivos e iterativos que necesitamos, sin afectar la esencia del problema.

Esta técnica probablemente fue mejor descrita por Michael Feathers hace algunos años en un artículo titulado "The Humble Dialog Box". También es la idea fundamental detrás del patrón Model-View-Presenter que causó tal revuelo hace cuatro años; y ahora se ha dividido en los patrones de Vista pasiva y Controlador de supervisión. El enlace del artículo en esta pregunta aprovecha estas ideas, pero en una prueba más que en una prueba.

La idea es probar todo excepto la vista. De hecho, ni siquiera necesitamos escribir la vista durante mucho tiempo. De hecho, la Vista es tan absurdamente simple que probablemente no necesita ningún tipo de pruebas unitarias. O si lo hace, de hecho pueden escribirse al final.

Para probar el Controlador de supervisión, simplemente asegúrese de entender cómo se presentarán los datos en la pantalla. No necesita saber dónde están los datos, ni cuál es la fuente, ni qué color es, ni ninguno de los otros problemas cosméticos que causan la iteración masiva de las GUI. Por el contrario, usted sabe que un elemento de datos será algún tipo de campo de texto. Otro será un menú, otro será un botón o una casilla de verificación. Y luego se asegura de que la Vista pueda hacer todas las preguntas que necesita para obtener estos elementos correctamente.

Por ejemplo, el cuadro de texto puede tener un valor predeterminado. The View debería poder solicitarlo. El menú puede tener algunos elementos en gris. The View debería poder solicitar esta información. Las preguntas que se hacen en la vista tienen que ver con la presentación y carecen de reglas comerciales.

De la misma manera, la vista le dirá al Controlador de Supervisión cuando algo cambie. El controlador modificará los datos de forma adecuada, incluido cualquier tipo de validación y recuperación de errores, y luego la vista puede preguntar cómo deben presentarse esos datos.

Todo esto puede probarse porque está totalmente desacoplado de la pantalla visual. Se trata de cómo se manipulan y presentan los datos, y no acerca de cómo se ve. Por lo tanto, no es necesario que se repita de forma masiva.

3

He probado con éxito el desarrollo de aplicaciones Swing y GWT a través de la GUI.

La prueba "justo detrás de la GUI" ignora la integración entre el código del modelo y los componentes de la GUI. La aplicación necesita conectar manejadores de eventos para mostrar datos en la GUI cuando el modelo cambia y recibe información de la GUI y actualiza el modelo. Probar que todos esos controladores de eventos se hayan conectado correctamente es muy tedioso si se hace manualmente.

El gran problema para superar cuando se prueba a través de la GUI es cómo hacer frente a los cambios en la GUI durante el desarrollo.

GWT tiene ganchos para ayudar con esto. Necesita establecer identificadores de depuración en los widgets de GWT e importar el módulo DebugID a su aplicación. Sus pruebas pueden interactuar con la aplicación controlando un navegador web, encontrando elementos por su id y haciendo clic en ellos o ingresando texto en ellos. Web Driver es una API muy buena para hacer esto.

Eso es solo el comienzo, sin embargo. También debe desacoplar sus pruebas de la estructura de la GUI: cómo el usuario navega a través de la interfaz de usuario para realizar su trabajo. Este es el caso si prueba a través de la GUI o detrás de la GUI contra el controlador. Si prueba en contra del controlador, el controlador determina la forma en que el usuario navega a través de las diferentes vistas de la aplicación, por lo que su prueba se acopla a esa estructura de navegación porque está acoplada al controlador.

Para solucionar esto, nuestras pruebas controlan la aplicación a través de una jerarquía de "controladores". Las pruebas interactúan con los controladores que le permiten realizar actividades centradas en el usuario, como iniciar sesión, ingresar un pedido y realizar un pago. El controlador captura el conocimiento de cómo se realizan esas tareas navegando e ingresando datos en la GUI. Lo hace mediante el uso de controladores de nivel inferior que capturan cómo la navegación y la entrada de datos se realiza mediante "gestos", como hacer clic en un botón o ingresar texto en un campo de entrada. Se termina con una jerarquía como:

  • los objetivos del usuario: los ensayos se comprueba que el usuario pueda alcanzar sus objetivos con el sistema y demuestra cómo estos objetivos se logran mediante una secuencia de ...
  • actividades de los usuarios: cosas que el usuario hace a través de la GUI, representadas como controladores que realizan ...
  • Gestos: entrada de mouse y teclado de bajo nivel para controlar la GUI.

Esta jerarquía que se utiliza a menudo en la literatura de diseño centrada en el usuario (aunque con diferente terminología).

Cuestiones relacionadas