Regresión (regression testing)
Todos los sistemas sufren una
evolución a lo largo de su vida activa. En cada nueva versión se supone que o
bien se corrigen defectos, o se añaden nuevas funciones, o ambas cosas. En
cualquier caso, una nueva versión exige una nueva pasada por las pruebas. Si
éstas se han sistematizado en una fase anterior, ahora pueden volver a pasarse
automáticamente, simplemente para comprobar que las modificaciones no provocan
errores donde antes no los había.
Las pruebas de regresión son
particularmente espectaculares cuando se trata de probar la interacción con un
agente externo. Existen empresas que viven de comercializar productos que
"graban" la ejecución de una prueba con operadores humanos para luego
repetirla cuantas veces haga falta "reproduciendo la grabación". Y,
obviamente, deben monitorizar la respuesta del sistema en ambos casos,
compararla, y avisar de cualquier discrepancia significativa.
Recorridos (walkthroughs)
Quizás es una técnica más aplicada
en control de calidad que en pruebas. Consiste en sentar alrededor de una mesa
a los desarrolladores y a una serie de críticos, bajo las órdenes de un
moderador que impida un recalentamiento de los ánimos. El método consiste en
que los revisores se leen el programa línea a línea y piden explicaciones de
todo lo que no está meridianamente claro. Puede que simplemente falte un
comentario explicativo, o que detecten un error auténtico o que simplemente el
código sea tan complejo de entender/explicar que más vale que se rehaga de
forma más simple. Para un sistema complejo pueden hacer falta muchas sesiones.
Esta técnica es muy eficaz
localizando errores de naturaleza local; pero falla estrepitosamente cuando el
error deriva de la interacción entre dos partes alejadas del programa. Nótese
que no se está ejecutando el programa, sólo mirándolo con lupa, y de esta forma
sólo se ve en cada instante un trocito del listado.
Aleatorias (random testing)
Ciertos autores consideran
injustificada una aproximación sistemática a las pruebas. Alegan que la
probabilidad de descubrir un error es prácticamente la misma si se hacen una
serie de pruebas aleatoriamente elegidas, que si se hacen siguiendo las
instrucciones dictadas por criterios de cobertura (caja negra o blanca).
Como esto es muy cierto,
probablemente sea muy razonable comenzar la fase de pruebas con una serie de
casos elegidos al azar. Esto pondrá de manifiesto los errores más patentes. No
obstante, pueden permanecer ocultos errores más sibilinos que sólo se muestran
ante entradas muy precisas.
Si el programa es poco crítico
(una aplicación personal, un juego, ...) puede que esto sea suficiente. Pero si
se trata de una aplicación militar o con riesgo para vidas humanas, es de todo
punto insuficiente.
Solidez (robustness testing)
Se prueba la capacidad del sistema
para salir de situaciones embarazosas provocadas por errores en el suministro
de datos. Estas pruebas son importantes en sistemas con una interfaz al
exterior, en particular cuando la interfaz es humana.
Por ejemplo, en un sistema que
admite una serie de órdenes (commands) se deben probar los siguientes extremos:
·
órdenes correctas, todas y cada
una
·
órdenes con defectos de sintaxis,
tanto pequeñas desviaciones como errores de bulto
·
órdenes correctas, pero en orden
incorrecto, o fuera de lugar
·
la orden nula (línea vacía, una o
más)
·
órdenes correctas, pero con datos
de más
·
provocar una interrupción (BREAK,
^C, o lo que corresponda al sistema soporte) justo después de introducir una orden.
·
órdenes con delimitadores
inapropiados (comas, puntos, ...)
·
órdenes con delimitadores
incongruentes consigo mismos (por ejemplo, esto]
Aguante (stress testing)
En ciertos sistemas es conveniente
saber hasta dónde aguantan, bien por razones internas (¿hasta cuantos datos
podrá procesar?), bien externas (¿es capaz de trabajar con un disco al 90%?,
¿aguanta una carga de la CPU del 90?, etc.)
Prestaciones (performance testing)
A veces es importante el tiempo de
respuesta, u otros parámetros de gasto. Típicamente nos puede preocupar cuánto
tiempo le lleva al sistema procesar tantos datos, o cuánta memoria consume, o
cuánto espacio en disco utiliza, o cuántos datos transfiere por un canal de
comunicaciones, o ... Para todos estos parámetros suele ser importante conocer
cómo evolucionan al variar la dimensión del problema (por ejemplo, al
duplicarse el volumen de datos de entrada).
Mutación (mutation testing)
Es una técnica curiosa consistente
en alterar ligeramente el sistema bajo pruebas (introduciendo errores) para
averiguar si nuestra batería de pruebas es capaz de detectarlo. Si no, más vale
introducir nuevas pruebas. Todo esto es muy laborioso y francamente artesano.
ACTIVIDAD
1 (OBLIGATORIA)
- Consulta los siguientes enlaces. Elige un error de cada enlace y elabora un documento donde los expliques con tus palabras.
ACTIVIDAD
2 (VOLUNTARIA)
¨ Intenta describir ejemplos prácticos que
encuentres por la red sobre las distintas pruebas vistas en este punto
No hay comentarios:
Publicar un comentario