Tema 6 - Pruebas y Depuracion de Programas
Tema 6 - Pruebas y Depuracion de Programas
Tema 6 - Pruebas y Depuracion de Programas
5. Ejercicios
1. Pruebas en el proceso de desarrollo de software
Situación
BK Programación se encuentra desarrollando la primera versión de la
aplicación de gestión hotelera.
Ada, la supervisora de proyectos de BK Programación, se reúne con
Juan y María para empezar a planificar el diseño y realización de
pruebas sobre la aplicación,
Ana se va a encargar, de ir probando las distintas partes de la
aplicación que se van desarrollando. Para ello usará casos de prueba
diseñados por Juan, y evaluará los resultados.
Juan evaluará los resultados de las pruebas realizadas por Ana, y en su
caso, realizará las modificaciones necesarias en el proyecto.
https://www.youtube.com/watch?v=9N5vPeSWRfQ
https://www.youtube.com/watch?v=LACAygzhCYw
2º Complejidad Ciclomática:
https://www.youtube.com/watch?v=GVegCwwfBZ0
If a or b
Then
Procedimiento x
Else
Procedimiento y
End_if
y x
Complejidad Ciclomática de McCabe
https://www.youtube.com/watch?v=iILl-n57IEs
Ejemplo:
Se trata de identificar un camino básico e ir haciendo variaciones sobre
este, por ejemplo:
_ 1 – 2 – 11
_ 1 – 2 – 3 – 4 – 10 – 2
1 – 2 – 3 – 5 – 10 – 2
_1–2–3–5–6–7-9
_1–2–3–5–6–8-9
Prueba de bucles
Los bucles son la piedra angular de la inmensa mayoría de los algoritmos
implementados en software, por lo que tenemos que prestarles una atención
especial a la hora de realizar la prueba del software.
La prueba de bucles es una técnica de prueba de caja blanca que se centra
en la validez de las construcciones de los bucles.
Se pueden definir cuatro tipos de bucles diferentes:
o Simples
o Concatenados
o Anidados
o No estructurados
Bucles simples:
Para este tipo de bucles se deben llevar a cabo los siguientes casos de
prueba - considerando que n, es el número máximo de pasos permitidos por
el bucle:
a. Pasar por alto totalmente el bucle
b. Pasar una sola vez por el bucle
c. Pasar dos veces por el bucle
d. Hacer “m” pasos por el bucle con m<n
e. Hacer n-1 , n y n+1 pasos por el bucle
a. Comenzar por el bucle más interior. Establecer los demás bucles en sus valores
mínimos.
b. Llevar a cabo las pruebas de bucles simples para el bucle más interior, mientras
se mantienen los parámetros de iteración (por ejemplo, contadores de bucles) de
los bucles externos en sus valores mínimos. Añadir otras pruebas para valores de
fuera de rango o excluidos
c. Progresar hacia fuera, llevando a cabo pruebas para el siguiente bucle, pero
manteniendo todos los bucles externos en sus valores mínimos y los demás bucles
anidados en sus valores “típicos”.
d. Continuar hasta que se hayan probado todos los bucles.
Bucles concatenados:
Probar los bucles concatenados mediante las técnicas de prueba para bucles
simples, considerándolos como bucles independientes
Bucles no estructurados
Siempre que sea posible, esta clase de bucles debe diseñarse nuevamente para
reflejar el uso de las construcciones de programación estructurada
http://ing-software3.blogspot.com/2013/
Ejemplo 1
PROCEDURE Media;
* Este procedimiento calcula la media de 100 o menos números que se encuentran
entre unos límites; también calcula el total de entradas y el total de números
válidos.
INTERFACE RETURNS media, total.entrada, total.valido;
INTERFACE ACEPTS valor, minimo, maximo;
TYPE valor [1:100] IS INTEGER ARRAY;
TYPE media, total.entrada, total.validom, inimo, maximo, suma IS INTEGER;
TYPE i IS INTEGER;
i=1
total.entrada = total.valido = 0
suma = 0
DO WHILE VALOR [i] <> ‐999 and total.entrada < 100
Incrementar total.entrada en 1;
IF valor [i] >= minimo AND valor [i] <= maximo
THEN
incrementar total.valido en 1;
suma = suma + valor [i];
ELSE ignorar
END IF
Incrementar i en 1;
END DO
IF total valido > 0
THEN media = suma/total.valido
ELSE media = ‐999
END IF
END MEDIA
1
1 4
0
1
11
2 5
2
1
3 6
7 8
V(g)=a-n+2= 17-13+2=6
V(g)=c+1 =5+1= 6 los 5 nodos son 2,3,5,6 y10
B.- Prueba de la Caja Negra
Estas pruebas se pueden ver desde un enfoque funcional del sistema, ya que
se diseñan los casos de prueba y los datos de prueba a partir de las
especificaciones funcionales del sistema, se busca probar completamente:
Las funciones realizadas por el sistema
El cumplimiento de los objetivos del sistema
Las reacciones del sistema ante los estímulos exteriores
Para comprobar el correcto funcionamiento del sistema se:
Introducen valores límites
Se introducen datos erróneos, valores susceptibles a crear
problemas.
Se introducen datos equivalentes
El problema que tienen las pruebas de Caja Negra es que los rangos de
datos son muy amplios y sería muy costoso probar todos los valores de un
rango, para evitar realizar esto se agrupan los datos en lo que llamamos
CLASES DE EQUIVALENCIA.
Tests Funcionales. Clases de equivalencia y valores límite:
https://www.youtube.com/watch?v=PmdFMDZVmmM
https://www.youtube.com/watch?v=pAVc6SY__cA&t=4s
Esta técnica trata cada parámetro como un modelo algebraico donde unos
datos son equivalentes a otros. Si logramos partir un rango excesivamente
amplio de posibles valores reales a un conjunto reducido de clases de
equivalencia, entonces es suficiente probar un caso de cada clase, pues los
demás datos de la misma clase son equivalentes.
Para crear las clases de equivalencia existe una norma que es la que sigue:
si un parámetro de entrada debe estar comprendido en un cierto
rango, aparecen 3 clases de equivalencia: por debajo, en el propio
rango y por encima del rango.
si una entrada requiere un valor concreto, aparecen 3 clases de
equivalencia: por debajo, en el rango y por encima del rango.
si una entrada requiere un valor de entre los de un conjunto, aparecen
2 clases de equivalencia: en el conjunto o fuera de él.
si una entrada es booleana, hay 2 clases: si o no.
los mismos criterios se aplican a las salidas esperadas: hay que
intentar generar resultados en todas y cada una de las clases.
Por ejemplo: Si la especificación del problema es la siguiente:
Código: número de 3 dígitos que no empieza ni por 0, ni por 1.
Identificador: 9 caracteres.
Ordenes posibles: "cheque", "depósito", "pago factura", "retirada de
fondos"
Edad: Entre 18 y 65
Condición de Entrada Clases de equivalencia válidas Clases de equivalencia inválidas
Código (1) 200 > codigo <999 (2) Codigo < 200
(3) Codigo > 999
(4) No es un número
Documentación
2. No incremental
Se prueba cada módulo por separado, y luego se integran todos a la vez y se
prueba el sistema completo.
b.- Pruebas de Sistema
Estas pruebas consideran el producto final al completo, es decir, al sistema
final, comprobando que módulos probados individualmente funcionan
correctamente cuando trabajan juntos, y que los fallos en el sistema pueden
ser debidos a una errónea comunicación entre subsistemas.
2. Herramientas integradas en los IDE para realización de
pruebas
Antonio está un poco confuso. La aplicación que están diseñando Juan y
María es ya de cierta envergadura y se pregunta por la labor ingente
que queda, solo para probar todos los componentes de la aplicación.
María le tranquiliza y le comenta que los Entornos de Desarrollo
actuales, incorporan herramientas que realizan las pruebas de cada
método, de forma automática.
Las pruebas unitarias, o prueba de la unidad, tienen por objetivo probar el
correcto funcionamiento de un módulo de código. El fin que se persigue, es
que cada módulo funciona correctamente por separado.
Con las pruebas unitarias se debe probar todas las funciones o métodos no
triviales de forma que cada caso de prueba sea independiente del resto.
Jtiger:
1 Framework de pruebas unitarias para Java (1.5).
2 Es de código abierto.
3 Capacidad para exportar informes en HTML, XML o texto plano.
4 Es posible ejecutar casos de prueba de Junit mediante un plugin.
5 Posee una completa variedad de aserciones como la comprobación de
cumplimiento del contrato en un método.
6 Los metadatos (Conjunto de datos que se utilizan para describir
otros datos) de los casos de prueba son especificados como anotaciones del
lenguaje Java
7 Incluye una tarea de Ant para automatizar las pruebas.
8 Documentación muy completa en JavaDoc, y una página web con toda
la información necesaria para comprender su uso, y utilizarlo con IDE como
Eclipse.
9 El Framework (Estructura conceptual y tecnológica de soporte
definida, normalmente con módulos de software concretos, con base en la
cual otro proyecto de software puede ser organizado y desarrollado ) incluye
pruebas unitarias sobre sí mismo.
TestNG:
10 Esta inspirado en JUnit y NUnit.
11 Está diseñado para cubrir todo tipo de pruebas, no solo las unitarias,
sino también las funcionales, las de integración ...
12 Utiliza las anotaciones de Java 1.5 (desde mucho antes que Junit).
13 Es compatible con pruebas de Junit.
14 Soporte para el paso de parámetros a los métodos de pruebas.
15 Permite la distribución de pruebas en maquinas esclavas.
16 Soportado por gran variedad de plug‐ins (Eclipse, NetBeans, IDEA ...)
17 Las clases de pruebas no necesitan implementar ninguna interfaz ni
extender ninguna otra clase.
18 Una vez compiladas las pruebas, estas se pueden invocar desde la
línea de comandos con una tarea de Ant o con un fichero XML.
19 Los métodos de prueba se organizan en grupos (un método puede
pertenecer a uno o varios grupos).
Junit:
20 Framework de pruebas unitarias creado por Erich Gamma y Kent
Beck.
21 Es una herramienta de código abierto.
22 Multitud de documentación y ejemplos en la web.
23 Se ha convertido en el estándar de hecho para las pruebas unitarias
en Java.
24 Soportado por la mayoría de los IDE como eclipse o Netbeans.
25 Es una implementación de la arquitectura xUnit para los frameworks
de pruebas unitarias.
26 Posee una comunidad mucho mayor que el resto de los frameworks de
pruebas en Java.
27 Soporta múltiples tipos de aserciones.
28 Desde la versión 4 utiliza las anotaciones del JDK 1.5 de Java.
29 Posibilidad de crear informes en HTML.
30 Organización de las pruebas en Suites de pruebas.
31 Es la herramienta de pruebas más extendida para el lenguaje Java.
32 Los entornos de desarrollo para Java, NetBeans y Eclipse, incorporan
un plugin para Junit.
Herramientas para otros lenguajes.
En la actualidad, nos encontramos con un amplio conjunto de herramientas
destinadas a la automatización de la prueba, para la mayoría de los lenguajes
de programación más extendidos en la actualidad. Existen herramientas
para C++, para PHP, FoxPro, etc.
CppUnit:
1 Framework de pruebas unitarias para el lenguaje C++.
2 Es una herramienta libre.
3 Existe diversos entornos gráficos para la ejecución de pruebas como
QtTestRunner.
4 Es posible integrarlo con múltiples entornos de desarrollo como
Eclipse.
5 Basado en el diseño de xUnit.
Nunit:
6 Framework de pruebas unitarias para la plataforma .NET.
7 Es una herramienta de código abierto.
8 También está basado en xUnit.
9 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
MOQ: Framework para la creación dinámica de objetos simuladores
(mocks).
Automatización de la prueba.
Caso práctico
Juan está realizando pruebas de la unidad, es decir, comprueba el
correcto funcionamiento de los métodos que ha implantado. Para ello,
utiliza la herramienta de prueba incorporadas en el entorno de
desarrollo. En su caso, ya que está utilizando NetBeans, se decanta
por Junit. Ana está muy interesada en conocer esta herramienta, que
ayuda notablemente en el proceso de pruebas.
INTRODUCCIÓN
Los entornos de desarrollo más extendidos, que se utilizan para
implementar aplicaciones Java, tales como NetBeans o Eclipse, incorporan
un plugin para trabajar con Junit
INICIO DE JUNIT
Para iniciar Junit, seleccionada en la ventana de proyectos la clase a probar,
abrimos el menú contextual y seleccionamos Herramientas > Crear
pruebas Junit.
Nos aparece un formulario donde nos da a elegir entre JUnit 3.x y JUnit
4.x. Son las dos versiones de JUnit disponibles en NetBeans 7.1. En nuestro
caso, elegimos JUnit 4.x.
CASOS DE PRUEBA
En primer lugar, vamos a ver la función de los Inicializadores y
Finalizadores. El método SetUp y el método tearDown, se utilizan para
inicializar y finalizar las condiciones de prueba, como puede ser la creación
de un objeto, inicialización de variables, etc. En algunos casos, no es
necesario utilizar estos métodos, pero siempre se suelen incluir.
package calculadora;
import org.junit.*;
import static org.junit.Assert.*;
public CalculadoraTest() {
}
@BeforeClass
public static void setUpClass()
throws Exception {
}
@AfterClass
public static void tearDownClass()
throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void testAdd() {
System.out.println("add");
int x = 0;
int y = 0;
int expResult = 0;
int result = Calculadora.add(x, y);
assertEquals(expResult, result);
// TODO review the generated test code and remove the default call
to fail.
fail("The test case is a prototype.");
}
@Test
public void testSubtract() {
System.out.println("Subtract");
int x = 0;
int y = 0;
int expResult = 0;
int result = Calculadora.Subtract(x, y);
assertEquals(expResult, result);
// TODO review the generated test code and remove the default call
to fail.
fail("The test case is a prototype.");
}
@Test
public void testSquare() {
System.out.println("Square");
int x = 0;
int expResult = 0;
int result = Calculadora.Square(x);
assertEquals(expResult, result);
// TODO review the generated test code and remove the default call
to fail.
fail("The test case is a prototype.");
}
@Test
public void testMain() {
System.out.println("main");
String[] args = null;
Calculadora.main(args);
// TODO review the generated test code and remove the default call
to fail.
fail("The test case is a prototype.");
}
}
4. La depuración de programas
4.2.Puntos de ruptura.
Tipos de ejecución.
Para poder depurar un programa, podemos ejecutar el programa de
diferentes formas, de manera que en función del problema que queramos
solucionar, nos resulte más sencillo un método u otro. Nos encontramos con
lo siguientes tipo de ejecución: paso a paso por instrucción, paso a paso por
procedimiento, ejecución hasta una instrucción, ejecución de un programa
hasta el final del programa,
Examinadores de variables.
int main()
{
int v[10]={12, 56, 33, 59, 8, 7, 75, 78, 44, 22};
int i=0, s=0;
while(i<10)
{
printf("%d\n",v[i]);
if(v[i]%2==0)
{
s+=v[i];
printf("Suma de pares: %d\n",s);
}
else
{
if(v[i]>=50)
printf("Número mayor de 50 %d\n",v[i]);
else
printf("Número menor de 50 %d\n",v[i]);
}
i++;
}
getchar();
return 0;
}
1. Leer x, y
2. Si (x<=0 )o(y<=0)entonces
3. Escribe “Deben ser no negativos”
Visualiza -1
4. Sino Si (x=1) o (y=1) entonces
5. Visualiza 1
6. Sino Mientras (x<>y)
7. Si (x>y) entonces
8. x=x-y
9. sino
y=y-x
10. fin Si
11. fin mientras
12visializa x
13. fin si
14. fin si
OK
5º.- Elaborar una batería de pruebas para un módulo que recibe como
entrada una cadena de caracteres y determina si puede ser una clave válida
o no (por lo tanto devuelve un valor lógico, verdadero o falso). Una clave se
considera válida si cumple los requisitos siguientes:
package maximo_minimo_media;
minimo=500;
if(x<minimo)
minimo=x;
if(y<minimo)
minimo=y;
return minimo;
}
7º.- Utilizando la ejecución paso a paso diga cómo van cambiando los valores
de la práctica 1 del ejercicio anterior.
Notas:
En todos los ejercicios siga el guión de las prácticas del tema
anterior.
Suba los ejercicios en un solo archivo pdf con el nombre
practica_tema_5_apellido1_apellido2_nombre