Programación II
Definiciones(I)
• VERIFICAR: Comprobar que el sistema cumple
fielmente con lo especificado
• VALIDAR: Comprobar que no hay errores
• ERROR: Incorrección dentro de un módulo
software que conduce a un resultado incorrecto
• FALLO: Es la manifestación de un error en el
software
ft
• DEFECTO: Es una desviación en el valor
esperado para una cierta característica
2
•1
•03/06/2010
Definiciones(II)
• PRUEBA: Proceso en el que se ejecuta un
sistema con el objetivo de detectar fallos
• DEPURACIÓN: Es el proceso en el que se
localiza el error que es la causa de un fallo, se
determina la forma de corregirlo, se evalúa el
efecto de la corrección y se lleva a cabo la
corrección.
corrección
– Después del proceso de depuración HAY QUE
REPETIR LAS PRUEBAS
Objetivo
• Realizar un barrido exhaustivo de todo el código es
impracticable por el coste que supone
• El coste de detectar un error suele ser mayor que el
de corrección
• Es fundamental seleccionar las pruebas
• Sólo las pruebas que revelen errores son las que
merecen la pena
• El objetivo
objeti o es ENCONTRAR ERRORES
– Una prueba que no detecta un error es un
fracaso
– Una prueba que detecta errores es exitosa
4
•2
•03/06/2010
Proceso
Configuración
del software Evaluación
Prueba
Depuración
Configuración Resultado
de la prueba Esperado
Pasar de nuevo
todas las pruebas
•3
•03/06/2010
Tipos de prueba
• Las pruebas se realizan a lo largo de todo el
desarrollo del sistema:
– Prueba modular o unitaria
– Prueba de integración
• Top-down
• Bottom-up
– Prueba del sistema
– Prueba de aceptación
– Prueba de regresión
• Otros tipos de pruebas
– Pruebas de estrés
– Pruebas de carga
7
Tipos de prueba
Pruebas unitarias o modulares
• Prueban el correcto funcionamiento de un
módulo de código
• Características:
– Automatizable
– Repetibles o Reutilizables
– Completas
– I d
Independientes
di t
• Deben estar correctamente documentadas
– Debe describir qué verifica y valida la prueba
•4
•03/06/2010
Diseño de Pruebas
• El diseño de las pruebas se dividen en dos:
– Técnicas de caja negra:
• Se centran en la funcionalidad del sistema.
– Técnicas de caja blanca:
• Se fundamentan en cómo está hecho el sistema.
Se utiliza el conocimiento sobre cómo está
codificado para definir las pruebas.
11
•5
•03/06/2010
12
¿Es necesario?
13
•6
•03/06/2010
17
18
•7
•03/06/2010
19
25
•8
•03/06/2010
26
28
•9
•03/06/2010
29
30
•10
•03/06/2010
– Cobertura de condición
Confianza
– Cobertura de bucle
+ +
31
32
•11
•03/06/2010
33
34
•12
•03/06/2010
36
•13
•03/06/2010
37
38
•14
•03/06/2010
•15
•03/06/2010
Revisiones de Código
• Comprobación de escritorio (desk checking).
• Comprobación por pares o iguales (peer review).
• Inspección:
I ió
– Un grupo de desarrolladores se asegura de que el código fuente
cumple una serie de condiciones (checklist): Inicialización de
variables, control de límites de arrays, liberación de memoria
dinámica, etc.
• Walkthrough o visita guiada:
– La realiza un grupo en el que al menos está el programador del
código fuente a revisar
– Una persona ajena al código fuente prepara un conjunto de
casos de prueba.
– Se ejecuta “mentalmente” en grupo el código para los casos de
prueba. Ejecución guiada por el programador del código.
– Se plantean preguntas al programador del código.
41
42
•16
•03/06/2010
43
44
•17
•03/06/2010
50
Pruebas de Aceptación
• Se realizan una vez que el sistema se ha
implantado en su entorno real de
funcionamiento.
• El objetivo es demostrar al cliente que el
sistema satisface sus necesidades.
• Tipos:
– Pruebas alfa (en el entorno de desarrollo)
– Pruebas beta (en el entorno del cliente)
51
•18
•03/06/2010
Pruebas de Regresión
• El objetivo es comprobar que toda nueva
versión de un producto software no es de menor
calidad que la anterior.
• Implica pasar nuevamente todas las pruebas.
• Es conveniente automatizar el proceso de
pruebas todo lo que se pueda.
52
53
•19
•03/06/2010
54
55
•20
•03/06/2010
JUNIT 4.5
56
JUnit
• Es un framework que permite definir y
automatizar pruebas.
pruebas
• Facilita el proceso de repetir las pruebas.
• Está desarrollada para java.
• Hay versiones para otros lenguajes.
• Se puede encontrar en http://www.junit.org
• La versión 4.5 requiere de java 1.5 o superior
• Para poder usarlo se requiere que en el
classpath esté junit-4.5.jar.
57
•21
•03/06/2010
JUnit
• JUnit trabaja con anotaciones ‘@’
• @Test: Indica que el método que viene a
continuación es una prueba:
/**
* Test method for {@link Ejemplo2#factorial2(int)}.
*/
@Test
public void testFactorial2Case1() {
int entrada = 0;
int resultadoEsperado = 1;
assertEquals(resultadoEsperado,
Ejemplo2.factorial2 (entrada));
}
58
JUnit
• Un test se marca como:
– Error: se ha producido una excepción no esperada o vence
un timeout
– Fail: No cumple el assert o no se genera una excepción
esperada
• Para implementar una prueba se puede utilizar
org.junit.Assert:
– static void assertTrue(boolean condition)
– static void assertTrue( String msg, boolean condition)
– static
t ti void l (St i msg, Object
id assertEquals(String
tE Obj t expected,
t d
Object actual)
– static void assertArrayEquals(Object[] expecteds,
Object[] actuals)
– etc.
59
•22
•03/06/2010
JUnit
• ¿Cómo probamos que un método genera una
excepción p.e.
p e factorial ((-1)?
1)?
• @Test (expected = exception.class)
/**
* Test method for {@link Ejemplo2#factorial2(int)}.
*/
@Test (expected = IllegalArgumentException.class)
public void testFactorial2Case3() {
int entrada = -1;
Ejemplo2.factorial2 (entrada);
}
60
JUnit
• ¿Cómo detectamos que no tarda mucho?
• @Test
@T t (ti
(timeoutt = milisegundos)
ili d )
/**
* Test method for {@link Ejemplo2#factorial2(int)}.
*/
@Test(timeout = 1)
public void testFactorial2Case2() {
int entrada = 20;
long resultadoEsperado =
Long.valueOf("2432902008176640000");
assertEquals(resultadoEsperado, Ejemplo2.factorial2
(entrada));
}
61
•23
•03/06/2010
JUnit
• Como se ha comentado en este tema, hay que
configurar el sistema para realizar las pruebas
• JUnit proporciona dos anotaciones para esto:
– @BeforeClass: Sólo se realiza una vez antes de que se
ejecute la primera prueba
– @Before: Se ejecuta justo antes de cada prueba
• Tenemos los pasos equivalentes para la finalización:
– @AfterClass se ejecuta al terminar todas las pruebas
– @After
@Aft se ejecuta
j t después
d é d de cada
d prueba
b
• Véase:
– trunk\ejemplos\Pruebas\src\PruebaAnotaciones.java
– trunk\ejemplos\Pruebas\src\PruebaColas.java
62
•24