¿Qué hacen los ingenieros de pruebas? ¿demostrar que el software funciona correctamente? ¿buscar fallos? ¿mejorar la calidad del software? Los expertos ofrecen diferentes definiciones para las pruebas del software pero hay algo en lo que todos parecen estar de acuerdo: probar software no consiste en demostrar que éste funciona correctamente. Esta visión se resume perfectamente en el viejo dicho atribuido a Dijkstra:
Program testing can be used to show the presence of bugs, but never to show their absence!
No sé si este enunciado está probado matemática o lógicamente pero a mí me resulta intuitivamente correcto por un motivo de peso: las grandes empresas e instituciones multinacionales invierten millones y millones de dólares en reparar fallos de sistemas software. Algunos de esos fallos se publican periódicamente en el excelente blog “Risk Factor“ en el que por ejemplo, recientemente, se publicó un fallo en GMail por el cual dejó de tener acceso temporalmente a mensajes de 40.000 cuentas de correo. En mi opinión, si grandes corporaciones como Google no pueden lograr que sus sistemas no tengan fallos, es porque hoy en día resulta técnicamente imposible construir software que no tenga fallos.
Glenford J. Myers argumenta en su clásico libro “The Art of Software Testing“, en esta misma línea, que no sólo es imposible demostrar que un programa funciona correctamente, sino que resulta inconveniente plantearse como objetivo que el software funcione perfectamente. Para él, resulta mucho más adecuado incluso desde un punto de vista psicológico que los ingenieros de pruebas se planteen un objetivo factible, esto es, descubrir fallos en los programas:
Testing is the process of executing a program with the intent of finding errors
Efectivamente, probar software para encontrar fallos resulta destructivo a corto plazo pero, conforme vayamos ejecutando diferentes pruebas en el software, descubriendo y eliminando fallos, a largo plazo conseguiremos tener software mejor, software en el que podemos confiar porque sobre él hemos ejecutado muchas pruebas y hemos conseguido que pase todas (o muchas) de ellas. ¿Qué confianza nos da un producto software que nunca hemos probado? Obviamente, ninguna. ¿Cómo podemos tener confianza en que un programa funciona razonablemente bien? Sólo lo lograremos si lo hemos probado mucho, en muy diferentes situaciones, y el software se comporta adecuadamente en todas esas situaciones.
Pero ¿es necesario ejecutar un programa para descubrir fallos? Si un ingeniero de pruebas descubre un problema en un programa sin haberlo ejecutado ¿no puede reportarlo? Quizá sea mejor ampliar esa definición y revisar la que utiliza habitualmente Cem Kaner, y que por ejemplo puede encontrarse en las diapositivas de su charla sobre “Software Testing as a Social Science“:
Software testing is an empirical and technical investigation conducted to provide stakeholders with information about the quality of the product or service under test.
Para Kaner, las pruebas no se reducen a ejecutar el software, sino que el ingeniero investiga el software empíricamente y desde un punto de vista técnico. Típicamente, por ejemplo, el ingeniero revisará la especificación al comenzar a diseñar pruebas de sistema. Si encuentra incongruencias en la especificación deberá tratar de determinar si se trata de un fallo, lo que puede requerir revisar actas de reuniones o ponerse en contacto con los analistas: el ingeniero de pruebas debe investigar para tener toda la información relevante respecto al software.
En cuanto al objetivo de las pruebas, en la definición de Kaner no se reduce exclusivamente a detectar fallos sino que se amplia a ofrecer información, datos, relacionados con la calidad de lo que se está probando. Dicha información tendrá unos destinatarios que, típicamente, pueden ser los encargados de desarrollar el software, los que deciden si el software se pone en producción o cualquier otra parte interesada. Lo que no hacen, o no deben hacer, los ingenieros de pruebas es tomar decisiones respecto al software. Deben estar especializados en extraer información del software y en comunicarla eficientemente a quienes deben tomar las decisiones oportunas. En un escenario típico recibirán un programa, diseñarán y ejecutarán un conjunto de pruebas y reportarán un conjunto de fallos. No es su labor decidir si los desarrolladores deben dedicar tiempo a eliminar esos fallos por lo que no puede decirse, estrictamente, que la calidad de un producto software esté asociada indisolublemente con la calidad de los procesos de pruebas. No se puede obtener un producto software de calidad sin haber ejecutado unas buenas pruebas, pero es preciso que la información que obtienen los ingenieros de pruebas sea utilizada adecuadamente por los destinatarios de dicha información en su toma de decisiones.
