Mi enfoque para las pruebas de GUI está evolucionando, al igual que el consenso de la industria. Pero creo que algunas técnicas clave están comenzando a surgir.
Utilizo una o más de estas técnicas, dependiendo de la situación (por ejemplo, qué tipo de GUI es, qué tan rápido se necesita construir, quién será el usuario final, etc.).
Prueba manual. Siempre tiene la GUI ejecutándose mientras trabaja en el código, y asegúrese de que esté sincronizada con el código. Usted prueba y vuelve a probar manualmente la parte en la que trabaja mientras trabaja en ella, cambiando entre el código y la aplicación en ejecución. Cada vez que completa un trabajo significativo, realiza una prueba general de toda la pantalla o área de la aplicación, para asegurarse de que no haya regresiones.
Examen de la unidad. Escribe pruebas para funciones o pequeñas unidades de comportamiento de GUI. Por ejemplo, sus gráficos pueden necesitar calcular diferentes tonos de un color en función de un color 'base'. Puede extraer este cálculo a una función y escribir una prueba unitaria para ella. Puede buscar una lógica como esta en la GUI (especialmente la lógica reutilizable) y extraerla en funciones discretas, que pueden probarse más fácilmente en la unidad. Incluso el comportamiento complejo se puede extraer y probar de esta manera; por ejemplo, una secuencia de pasos en un asistente se puede extraer a una función y una prueba de unidad puede verificar que, dada una entrada, se devuelve el paso correcto.
Explorador de componentes. Crea una pantalla de 'explorador' cuyo único rol es mostrar cada uno de los componentes reutilizables que componen su GUI. Esta pantalla le brinda una forma rápida y fácil de verificar visualmente que cada componente tiene la apariencia correcta. El explorador de componentes es más eficiente que pasar manualmente por toda la aplicación, porque A) solo tiene que verificar cada componente una vez, y B) no tiene que navegar profundamente en la aplicación para ver el componente, solo puede ver y verifíquelo de inmediato.
Pruebas de automatización. Escribe una prueba que interactúa con la pantalla o el componente, simulando clics del mouse, entrada de datos, etc., afirmando que la aplicación funciona correctamente dadas estas manipulaciones. Esto puede ser útil como una prueba de respaldo adicional, para capturar posibles errores que sus otras pruebas podrían perder. Tiendo a reservar pruebas de automatización para las partes de la GUI que son más propensas a romperse y / o son muy críticas. Partes donde quiero saber lo antes posible si algo se ha roto. Esto podría incluir componentes interactivos altamente complejos que son vulnerables a roturas o pantallas principales importantes.
Prueba de diferencia / instantánea. Escribe una prueba que simplemente captura el resultado como una captura de pantalla o como código HTML y lo compara con el resultado anterior. De esa manera, te alertan cada vez que cambia la salida. Las pruebas de diferencias pueden ser útiles si el aspecto visual de su GUI es complejo y / o está sujeto a cambios, en cuyo caso, desea una retroalimentación rápida y visual sobre el impacto que un cambio dado tiene en la GUI en su conjunto.
En lugar de utilizar cualquier tipo de prueba de manera forzada, prefiero elegir la técnica de prueba según el tipo de cosas en las que estoy trabajando. Entonces, en un caso extraeré una función simple y la probaré unitariamente, pero en otro caso agregaré un componente al explorador de componentes, etc. Depende de la situación.
No he encontrado que la cobertura de código sea una métrica muy útil, pero otros pueden haberle encontrado utilidad.
Creo que la primera medida es el número y la gravedad de los errores. Su primera prioridad es probablemente tener una aplicación que funcione correctamente. Si la aplicación funciona correctamente, debería haber pocos o ningún error. Si hay muchos errores graves o graves, entonces, presumiblemente, no está realizando la prueba o sus pruebas no son efectivas.
Además de reducir errores, existen otras medidas como el rendimiento, la usabilidad, la accesibilidad, la capacidad de mantenimiento, la extensibilidad, etc. Éstas diferirán según el tipo de aplicación que esté creando, el negocio, el usuario final, etc.
Todo esto se basa en mi experiencia personal e investigación, así como en una excelente reseña sobre las pruebas de IU de Ham Vocke .