Un enfoque novedoso para la generación de conjuntos de pruebas, adaptado a partir de una técnica de CLI, implica el uso de un sistema de planificación. La planificación es una técnica bien estudiada del dominio de la inteligencia artificial (IA) que intenta resolver problemas que involucran cuatro parámetros:
- un estado inicial,
- un estado de objetivo,
- un conjunto de operadores, y
- un conjunto de objetos para operar.
Los sistemas de planificación determinan una ruta desde el estado inicial hasta el estado de meta mediante el uso de los operadores. Como un ejemplo simple de un problema de planificación, dadas dos palabras y una sola operación que reemplaza una sola letra en una palabra por otra, el objetivo podría ser cambiar una palabra por otra.
En los autores se utilizó el planificador IPP para demostrar esta técnica. La interfaz de usuario del sistema se analiza primero para determinar las posibles operaciones. Estos se convierten en los operadores utilizados en el problema de planificación. A continuación se determina un estado inicial del sistema, y se especifica un estado de objetivo que el probador siente que permitiría el ejercicio del sistema. El sistema de planificación determina una ruta desde el estado inicial hasta el estado de meta, que se convierte en el plan de prueba.
El uso de un planificador para generar los casos de prueba tiene algunas ventajas específicas sobre la generación manual. Un sistema de planificación, por su propia naturaleza, genera soluciones a problemas de planificación de una manera que es muy beneficiosa para el probador:
- Los planes siempre son válidos. La salida del sistema es un plan válido y correcto que utiliza a los operadores para alcanzar el estado de meta o ningún plan en absoluto. Esto es beneficioso porque se puede perder mucho tiempo al crear manualmente un conjunto de pruebas debido a casos de prueba inválidos que el probador pensó que funcionarían pero no lo hicieron.
- Un sistema de planificación presta atención al orden. A menudo, para probar una función determinada, el caso de prueba debe ser complejo y seguir una ruta a través de la interfaz gráfica de usuario donde las operaciones se realizan en un orden específico. Cuando se hace manualmente, esto puede conducir a errores y también puede ser bastante difícil y llevar mucho tiempo.
- Finalmente, y lo más importante, un sistema de planificación está orientado a objetivos. El probador está enfocando la generación del conjunto de pruebas en lo más importante, probando la funcionalidad del sistema.
Al crear manualmente un conjunto de pruebas, el probador se centra más en cómo probar una función (es decir, la ruta específica a través de la interfaz gráfica de usuario). Mediante el uso de un sistema de planificación, se cuida la ruta y el probador puede centrarse en qué función probar. Un beneficio adicional de esto es que un sistema de planificación no está restringido de ninguna manera al generar la ruta y, a menudo, puede encontrar una ruta que el probador nunca anticipó. Este problema es muy importante de combatir.
Otro método para generar casos de prueba de GUI simula a un usuario novato. Un usuario experto de un sistema tiende a seguir una ruta directa y predecible a través de una interfaz gráfica de usuario, mientras que un usuario novato seguiría una ruta más aleatoria. Es probable que un usuario novato explore más estados posibles de la interfaz gráfica de usuario que un experto.
La dificultad radica en generar conjuntos de pruebas que simulen el uso del sistema «novato». Se han propuesto algoritmos genéticos para resolver este problema. Las rutas de principiante a través del sistema no son rutas aleatorias. En primer lugar, un usuario novato aprenderá con el tiempo y generalmente no cometerá los mismos errores repetidamente, y, en segundo lugar, un usuario novato está siguiendo un plan y probablemente tenga algún conocimiento del dominio o del sistema.
Los algoritmos genéticos funcionan de la siguiente manera: un conjunto de «genes» se crean aleatoriamente y luego se someten a alguna tarea. Los genes que mejor completan la tarea se conservan y los que no se descartan. El proceso se repite de nuevo con los genes sobrevivientes que se replican y el resto del conjunto se rellena con más genes aleatorios. Finalmente, un gen (o un pequeño conjunto de genes que si hay algún umbral establecido) será el único gen en el conjunto y es, naturalmente, el mejor ajuste para el problema dado.
En el caso de las pruebas de interfaz gráfica de usuario, el método funciona de la siguiente manera. Cada gen es esencialmente una lista de valores enteros aleatorios de alguna longitud fija. Cada uno de estos genes representa un camino a través de la GUI. Por ejemplo, para un árbol de widgets dado, el primer valor en el gen (cada valor se llama alelo) seleccionaría el widget para operar, los siguientes alelos completarían la entrada al widget dependiendo del número de posibles entradas al widget (por ejemplo, un cuadro de lista desplegable tendría una entrada: el valor de lista seleccionado). El éxito de los genes se puntúa por un criterio que recompensa el mejor comportamiento «novato».
Se describe un sistema para hacer esta prueba para el sistema de ventanas X, pero extensible a cualquier sistema de ventanas. El sistema X Window proporciona funcionalidad (a través de XServer y el protocolo de editores) para enviar dinámicamente la entrada de la interfaz gráfica de usuario y obtener la salida de la interfaz gráfica de usuario del programa sin usar directamente la interfaz gráfica de usuario. Por ejemplo, se puede llamar a XSendEvent () para simular un clic en un menú desplegable, y así sucesivamente. Este sistema permite a los investigadores automatizar la creación y prueba de genes, de modo que para cualquier aplicación dada bajo prueba, se puede crear un conjunto de casos de prueba para usuarios novatos.