Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
DISEO Y
REALIZACIN
DE PRUEBAS
Una prueba de tipo Caja Negra se lleva a cabo sin tener que conocer ni la estructura, ni el
funcionamiento interno del sistema. Cuando se realiza este tipo de pruebas, solo se conocen
las entradas adecuadas que deber recibir la aplicacin, as como las salidas que les correspondan,
pero no se conoce el proceso mediante el cual la aplicacin obtiene esos resultados.
En contraposicin a lo anterior, una prueba de Caja Blanca, va a analizar y probar
directamente el cdigo de la aplicacin. Como se deriva de lo anterior, para llevar a cabo una
prueba de Caja Blanca, es necesario un conocimiento especfico del cdigo, para poder analizar los
resultados de las pruebas.
TIPOS DE PRUEBAS DEL SOFTWARE
Pruebas de unidad
Con ella se va a probar el correcto funcionamiento de un mdulo de
cdigo
Pruebas de carga
Pruebas para determinar y validar la respuesta de la aplicacin cuando
es sometida a una carga de usuarios y/o transacciones que se espera
en el ambiente de produccin. Ejemplo: verificar la correcta respuesta
de la aplicacin ante el alta de 100 usuarios en forma simultnea. Se
compara con el volumen esperado. Si la base de datos, el servidor de
aplicaciones, etc tambin se monitorizan, entonces esta prueba puede
mostrar el cuello de botella en la aplicacin
Prueba
de
Estas pruebas se realizan para medir la respuesta de la aplicacin a
rendimiento
distintos volmenes de carga esperados (cantidad de usuarios y/o
peticiones). Ejemplo: velocidad de respuesta al procesar el ingreso de
10, 100 y 1000 usuarios en forma simultnea. Se comprar con el
rendimiento esperado.
Prueba de estrs
Esta prueba se utiliza normalmente para romper la aplicacin. Se va
doblando el nmero de usuarios que se agregan a la aplicacin y se
ejecuta una prueba de carga hasta que se rompe. Son pruebas de carga
o rendimiento, pero superando los lmites esperados en el ambiente de
produccin y/o determinados en las pruebas. Ejemplo: encontrar la
cantidad de usuarios simultneos, en que la aplicacin deja de
responder (cuelgue o time out) en forma correcta a todas las
peticiones.
Pruebas de picos
La prueba de picos, como el nombre sugiere, trata de observar el
comportamiento del sistema variando el nmero de usuarios, tanto
cuando bajan, como cuando tiene cambios drsticos en su carga.
Esta prueba se recomienda que sea realizada con un software
automatizado que permita realizar cambios en el nmero de usuarios
mientras que los administradores llevan un registro de los valores a ser
monitorizados
Prueba estructural
El enfoque estructural o de caja blanca se centra en la estructura
interna del programa (analiza los caminos de ejecucin).
Prueba funcional
El enfoque funcional o de caja negra se centra en las funciones,
entradas y salidas que recibe y produce un mdulo o funcin concreta.
Pruebas
de
El objetivo de las pruebas de regresin es garantizar que ante cualquier
regresin
modificacin al cdigo actual, ya sea por mantenimiento o por la
incorporacin de nueva funcionalidad, no se vea afectada en el resto de
las secciones que integran a la aplicacin.
Cobertura de Sentencias: Se escriben casos de prueba suficientes para que cada sentencia en el
programa se ejecute, al menos, una vez.
Cobertura de Decisin: Se escriben casos de prueba suficientes para que cada decisin en el
programa se ejecute una vez con resultado verdadero y otra con el falso.
Cobertura de Condiciones: Se escriben casos de prueba suficientes para que cada condicin en
una decisin tenga una vez resultado verdadero y otra falso.
Cobertura de Condicin Mltiple: Se escriben casos de prueba suficientes para que todas las
combinaciones posibles de resultados de cada condicin se invoquen al menos una vez.
Cobertura de Caminos: Se escriben casos de prueba suficientes para que se ejecuten todos los
caminos de un programa. Entendiendo camino como una secuencia de sentencias encadenadas
desde la entrada del programa hasta su salida.
Al igual que ocurra con las tcnicas de Caja Blanca, para confeccionar los casos de prueba de
Caja Negra existen distintos criterios. Algunos de ellos son:
Particiones de Equivalencia.
Anlisis de Valores Lmite.
Mtodos Basados en Grafos.
Pruebas de Comparacin.
Anlisis Causa-Efecto.
Por ejemplo: Entero para identificar el nmero de espectadores de un teatro (en nuestro caso el aforo
es de 200)
Condicin Externa
[0..200]
2.2.2.
Caso de Prueba
E<0
E=0
E>0
E=200
E<200
E>200
Validez
No vlido
Vlido
Vlido
Vlido
Vlido
No vlido
Representante
-1
0
1
200
199
201
La experiencia muestra que los casos de prueba que exploran las condiciones lmite producen mejor
resultado que aquellos que no lo hacen. Las condicione lmite son aquellas que se hayan en los mrgenes
de la clase de equivalencia, tanto de entrada como de salida. Por ello, se ha desarrollado el anlisis de
valores lmite como tcnica de prueba. Esta tcnica nos lleva a elegir los casos de prueba que ejerciten los
valores lmite.
Por lo tanto, el anlisis de valores lmite complementa la tcnica de particin de equivalencia de manera
que:
En lugar de seleccionar cualquier caso de prueba de las clases vlidas e invlidas, se eligen los
casos de prueba en los extremos.
En lugar de centrase slo en el dominio de entrada, los casos de prueba se disean tambin
considerando el dominio de salida.
Las pautas para desarrollar casos de prueba con esta tcnica son:
Si una condicin de entrada especifica un rango de valores (-l.0 valor +1.0) se deben generar
casos para los extremos del rango (-1.0 y +1.0) y casos no vlidos para situaciones justo ms all
de los extremos (- 1.001 y + 1.001, en el caso en que se admitan 3 decimales).
Si la condicin de entrada especifica un nmero de valores (el fichero de entrada tendr de 1 a
255 registros), hay que escribir casos para los nmeros mximo, mnimo, uno ms del mximo
y uno menos del mnimo de valores (0, 1, 255 y 256 registros).
Si la entrada o salida de un programa es un conjunto ordenado, habr que prestar atencin a los
elementos primero y ltimo del conjunto.
Ejemplo: la capacidad mxima de un teatro es de 200 personas (son unidades completas)
Num
1
2
3
Caso de Prueba
E<0
E=0
E=200
Validez
No vlido
Vlido
Vlido
Representante
-1
0
200
6
E>200
No vlido
201
2.3.- Regresin.
Durante el proceso de prueba, tendremos xito si detectamos un posible fallo o error. La
consecuencia directa de ese descubrimiento, supone la modificacin del componente donde se ha
detectado. Esta modificacin, puede generar errores colaterales, que no existan antes. Como
consecuencia, la modificacin realizada nos obliga a repetir pruebas que hemos realizado con
anterioridad.
El objetivo de las pruebas de regresin, es comprobar que los cambios sobre un componente de una
aplicacin, no introduce un comportamiento no deseado o errores adicionales en otros componentes
no modificados.
Las pruebas de regresin se deben llevar a cabo cada vez que se hace un cambio en el
sistema, tanto para corregir un error, como para realizar una mejora. No es suficiente
probar slo los componentes modificados o aadidos, o las funciones que en ellos se
realizan, sino que tambin es necesario controlar que las modificaciones no produzcan
efectos negativos sobre el mismo u otros componentes.
Normalmente, este tipo de pruebas implica la repeticin de las pruebas que ya se hayan realizado
previamente, con el fin de asegurar que no se introducen errores que puedan comprometer el
funcionamiento de otros componentes que no han sido modificados y confirmar que el sistema
funciona correctamente una vez realizados los cambios.
En un contexto ms amplio, las pruebas de software con xito, son aquellas que dan como resultado
el descubrimiento de errores. Como consecuencia del descubrimiento de errores, se procede a su
correccin, lo que implica la modificacin de algn componente del software que se est
desarrollando, tanto del programa, de la documentacin y de los datos que lo soportan. La prueba de
regresin es la que nos ayuda a asegurar que estos cambios no introducen un comportamiento no
deseado o errores adicionales. La prueba de regresin se puede hacer manualmente, volviendo a
realizar un subconjunto de todos los casos de prueba o utilizando herramientas automticas.
7
Una muestra representativa de pruebas que ejercite todas las funciones del software;
Pruebas que se centran en los componentes del software que han cambiado.
Pruebas adicionales que se centran en las funciones del software que se van a ver
probablemente afectadas por el cambio;
Para evitar que el nmero de pruebas de regresin crezca demasiado, se deben de disear para
incluir slo aquellas pruebas que traten una o ms clases de errores en cada una de las funciones
principales del programa. No es prctico ni eficiente volver a ejecutar cada prueba de cada funcin
del programa despus de un cambio.
Algunas veces es necesario ejecutar un programa lnea por lnea, para buscar y corregir
errores lgicos. El avance paso a paso a lo largo de una parte del programa puede ayudarnos
a verificar que el cdigo de un mtodo se ejecute en forma correcta.
El paso a paso por procedimientos, nos permite introducir los parmetro que queremos a un
mtodo o funcin de nuestro programa, pero en vez de ejecutar instruccin por instruccin
ese mtodo, nos devuelve su resultado. Es til, cuando hemos comprobado que un
procedimiento funciona correctamente, y no nos interese volver a depurarlo, slo nos
interesa el valor que devuelve.
En el IDE NetBeans, dentro del men de depuracin, podemos seleccionar los modos de ejecucin
especificados, y algunos ms. El objetivo es poder examinar todas las partes que se consideren
necesarias, de manera rpida, sencilla y los ms clara posible.
La lnea verde, me indica la instruccin por la que va analizando el depurador. En la imagen, tambin
podemos observar la ventana de variables. Esta ventana se utiliza en depuracin para inspeccionar el
valor que van tomando a lo largo de la ejecucin.
En nuestro ejemplo depuramos un mtodo de ordenacin de un array, vemos los valores que toman
las variables i, j y temp, as como el tipo al que estn definidas. Podemos evaluar las expresiones que
queramos. En este caso estamos evaluando los valores que toman las variables i, j y temp, y tambin
comprobamos los valores almacenados en el vector. Si durante la depuracin comprobamos que
la aplicacin no hace aquello que debiera, podemos cambiarla. Si hemos depurado, y consideramos
que la aplicacin funciona, podemos pasar a probarla. Para ello, diseamos casos de prueba en Junit y
los aplicamos
EJERCICIO 2: Por fin hemos encontrado trabajo y nuestra primera tarea es realizar el
mantenimiento de un Proyecto. El programador que realiz dicho Proyecto ya no est en la
empresa y tampoco dej ninguna documentacin. Por lo tanto, antes de ponernos con el
mantenimiento es necesario que sepamos que funciones desarrolla el software. As, que
ayudndonos de la herramienta de depuracin tenemos que saber qu realiza el programa.
Se pide que a partir de los programas que os proporcione el profesor:
Averiguar qu hace cada uno de los programas.
Una vez que se sepa lo que hace cada programa, ser necesario
aadir comentarios significativos al cdigo, renombrar variables
con nombres significativos, cambiar los mensajes que se
proporciona a los usuarios finales,. Todo aquello que creais que
facilitar el futuro mantenimiento del programa, para t u otro
compaero.
4.- Validaciones.
En el proceso de validacin, interviene de manera decisiva el cliente. Hay que tener en cuenta, que
estamos desarrollando una aplicacin para terceros, y que son estos los que deciden si la aplicacin
se ajusta a los requerimientos establecidos en el anlisis.
En la validacin intentan descubrir errores, pero desde el punto de vista de los requisitos
(Comportamiento y casos de uso que se esperan que cumpla el software que se est diseando).
La validacin del software se consigue mediante una serie de pruebas de caja negra que demuestran
la conformidad con los requisitos. Un plan de prueba traza la clase de pruebas que se han de llevar a
cabo, y un procedimiento de prueba define los casos de prueba especficos en un intento por
descubrir errores de acuerdo con los requisitos. Tanto el plan como el procedimiento estarn
diseados para asegurar que se satisfacen todos los requisitos funcionales, que se alcanzan todos los
requisitos de rendimiento, que las documentaciones son correctas e inteligible y que se alcanzan
otros requisitos, como portabilidad (Capacidad de un programa para ser ejecutado en cualquier
arquitectura fsica de un equipo), compatibilidad, recuperacin de errores, facilidad de
mantenimiento etc.
Cuando se procede con cada caso de prueba de validacin, puede darse una de las dos condiciones
siguientes:
Enfoque estructural o de caja blanca. Este enfoque se centra en la estructura interna del
programa, analizando los caminos de ejecucin. Dentro de nuestro proceso de prueba, lo
aplicamos con el cubrimiento.
Enfoque funcional o de caja negra. Este enfoque se centra en las funciones, entradas y salidas.
Se aplican los valores lmite y las clases de equivalencia.
Enfoque aleatorio, que consiste en utilizar modelos que represente las posibles entradas
al programa, para crear a partir de ellos los casos de prueba. En esta prueba se intenta
simular la entrada habitual que va a recibir el programa, para ello se crean datos entrada en la
secuencia y con la frecuencia en que podran aparecer. Para ello se utilizan generadores
automticos de casos de prueba.
Autoevaluacin
Durante la validacin:
Procedemos a depurar el programa.
Sometemos el cdigo a pruebas de cubrimiento.
Comprobamos que la aplicacin cumple los requerimientos del cliente.
En esta prueba, es el cliente, junto con el equipo de desarrollo, quienes comprueban que lo desarrollado cumple las especificaciones
establecidas.
5.1.- Cubrimiento.
Esta tarea la realiza el programador y consiste en comprobar que los caminos definidos en el
cdigo, se pueden llegar a recorrer.
Este tipo de prueba, es de caja blanca, ya que nos vamos a centrar en el cdigo de nuestra aplicacin.
Con este tipo de prueba, lo que se pretende, es
comprobar que todas las funciones, sentencias,
decisiones, y condiciones, se van a ejecutar.
Por ejemplo:
Considerando que esta funcin forma parte de un
programa mayor, se considera lo siguiente:
Si durante la ejecucin del programa, la funcin es llamada, al menos una vez, el cubrimiento
de la funcin es satisfecho.
El cubrimiento de sentencias para esta funcin, ser satisfecho si es invocada, por ejemplo
como prueba(1,1), ya que en esta caso, cada lnea de la funcin se ejecuta, incluida z=x;
Si invocamos a la funcin con prueba(1,1) y prueba(0,1), se satisfar el cubrimiento de
decisin.
En el primer caso, la if condicin va a ser verdadera, se va a ejecutar z=x, pero en el
13
Ejercicio01-Nombre-Apellidos.doc
Si el parmetro x de entrada tiene que ser mayor estricto que 5, y el valor es real, los
valores lmite pueden ser 4,99 y 5,01.
3. Documenta el cdigo: Las propias pruebas son documentacin del cdigo puesto que ah se
puede ver cmo utilizarlo.
4. Separacin de la interfaz y la implementacin: Dado que la nica interaccin entre los casos de
prueba y las unidades bajo prueba son las interfaces de estas ltimas, se puede cambiar
cualquiera de los dos sin afectar al otro.
5. Los errores estn ms acotados y son ms fciles de localizar: dado que tenemos pruebas
unitarias que pueden desenmascararlos.
CppUnit:
Framework de pruebas unitarias para el lenguaje C++.
Es una herramienta libre.
16
Nunit:
Framework de pruebas unitarias para la plataforma .NET.
Es una herramienta de cdigo abierto.
Tambin est basado en xUnit.
Dispone de diversas expansiones como Nunit.Forms o Nunit.ASP. Junit
SimpleTest: Entorno de pruebas para aplicaciones realizadas en PHP.
PHPUnit: framework para realizar pruebas unitarias en PHP.
FoxUnit: framework OpenSource de pruebas unitarias para Microsoft Visual FoxPro
Autoevaluacin
Las herramientas de automatizacin de pruebas ms extendida para Java es:
Junit.
FoxUnit.
Simple
Test.
17
INICIO DE JUNIT
Para iniciar Junit, seleccionada en la ventana
de proyectos la clase a probar, o el paquete y
seleccionamos Tools Create/Update Test.
Nos aparece una nueva ventana, lo dejamos
todo igual expect que deseleccionamos las
opciones de Generate Test Suites, Test
Initializer , Test Finalizer y pulsamos OK.
18
El diseo de los casos de prueba, requiere que se establezcan criterios que garanticen que esa
prueba tiene muchas probabilidades de encontrar algn error no detectado hasta el momento.
Todos los mtodos fallan, por lo tanto ser necesario crearnos unos casos de prueba, vamos a verlo
ms en detalle
CASOS DE PRUEBA
En primer lugar, vamos a ver la funcin de los Inicializadores y Finalizadores. El mtodo SetUp y el
mtodo tearDown, se utilizan para inicializar y finalizar las condiciones de prueba, como puede ser la
creacin de un objeto, inicializacin de variables, etc. En algunos casos, no es necesario utilizar estos
mtodos, pero siempre se suelen incluir.
El mtodo setUpClass es un mtodo de inicializacin de la prueba y se ejecutan antes de cada
caso de prueba, en la clase de prueba. Este mtodo no es necesario para ejecutar pruebas,
pero si es necesario para inicializar algunas variables antes de iniciar la prueba.
El mtodo tearDownClass es un mtodo finalizador de prueba, y se ejecutar despus de cada test
en la clase prueba. Un mtodo finalizador no es necesario para ejecutar las pruebas, pero si
necesitamos un finalizador para limpiar algn dato que fue requerido en la ejecucin de los casos de
prueba.
En segundo lugar, es necesario conocer las aserciones. Los mtodo assertXXX(), se utilizan para hacer
19
las pruebas. Estos mtodos, permiten comprobar si la salida del mtodo que se est probando,
concuerda con los valores esperados. Las principales son:
assertEquals() Se usa para comprobar igualdad a nivel de contenidos. La igual de tipos primitivos
se compara usando ==, la igualdad entre objetos se compara con el mtodo equals(). La prueba
pasa si los valores de los argumentos son iguales.
assertTrue():
assertFalse(): evala una expresin booleana. La prueba pasa si el valor de la expresin es false.
assertSame()
compara dos referencias y asegura que los objetos referenciados tienen la
misma direccin de memoria. La prueba pasa si los dos argumentos son el mismo objeto o
pertenecen al mismo objeto.
fails()
causa que la prueba falle inmediatamente. Se puede usar cuando la prueba indica un
error o cuando se espera que el mtodo que se est probando llame a una excepcin.
En este punto, nos disponemos a disear los mtodos que necesitemos para los casos de prueba.
Por defecto se nos han creado los siguientes casos de pruebas, y lo primero que tenemos que hacer es
dar valores a las variables, number 1 y number 2 y el resultado esperado de la operacin, en cada uno
de los mtodos test:
double number1 = 0.0;
double number2 = 0.0;
double expResult = 0.0;
20
21
EJERCICIO 4: Tenemos un array de enteros y nos hemos creado el siguiente programa para obtener
el mayor valor del array:
El programa que se os entrega no tiene ningn error de compilacin pero no sabemos si funciona
correctamente. Disea casos de pruebas y prubalos con Junit.
Ejemplo: Hasta ahora hemos visto ejemplos sencillos de clases de equivalencia y casos de prueba,
vamos a ver un ejemplo ms complejo y real.
Tenemos que implementar la gestin de empleados en una tienda, en especial el Clculo del Salario
Bruto y el Clculo del Salario Neto. El documento de especificacin de requisitos indica lo siguiente al
respecto:
double
El salario base ser 1000 si el empleado es de tipo vendedor, y de 1500
calculaSalarioBruto(
String tipo,
si es de tipo encargado. A esta cantidad se le sumar una prima de 100 si
double ventasMes,
ventasMes es mayor o igual que 1000, y de 200 si fuese al menos de
int horasExtra)
1500. Por ltimo, cada hora extra se pagar a 20 euros. Si tipo de
empleado es null, o ventasMes o horasExtra toman valores negativos el
mtodo lanzar una excepcin.
double
calculaSalarioNeto(
double
salarioBruto)
A partir de dichas especificaciones podemos disear un conjunto de casos de prueba siguiendo mtodos
de las pruebas funcionales:
Mtodo
calculaSalarioBruto
calculaSalarioBruto
calculaSalarioBruto
calculaSalarioBruto
calculaSalarioBruto
calculaSalarioBruto
calculaSalarioBruto
calculaSalarioBruto
calculaSalarioBruto
calculaSalarioBruto
calculaSalarioBruto
Tipo
vendedor
vendedor
vendedor
encargado
encargado
encargado
encargado
encargado
vendedor
vendedor
null
Entrada
Ventas Mes
2000
1500
1499.99
1250
1000
999.9
500
0
-1
1500
1500
Horas
extras
8h
3h
0h
8h
0h
3h
0h
8h
8h
-1h
8h
Salida esperada
1360
1260
1100
1760
1600
1560
1500
1660
Exception
Exception
Exception
Caso de
Prueba
CP1
CP2
CP3
CP4
CP5
CP6
CP7
CP8
CP9
CP10
CP11
22
23
24