Publicado el 10 de Septiembre del 2020
556 visualizaciones desde el 10 de Septiembre del 2020
889,2 KB
20 paginas
Creado hace 18a (20/02/2007)
JUNIT. Pruebas Unitarias
Dpto. de Ingeniería de Sistemas Telemáticos
http://www.lab.dit.upm.es/~lprg
Introducción
• Un programa es aceptable cuando:
– Hace lo que se acordó que debía hacer en las especificaciones.
– No hace lo que no debe hacer.
• “Un programador jamás debería entregar un programa sin
haberlo probado. Igualmente, quien recibe un programa de
otro jamás debería aceptarlo sin haberlo probado.
• Para aprobar una práctica ésta debe pasar las pruebas
funcionales.
• Cualquier funcionalidad de un programa sin una prueba
automatizada, simplemente no existe” (Extreme Programming
Explained”, de Kent Beck)
Febrero 2004
JUNIT. Pruebas Unitarias
2
1
Pruebas Unitarias Sistemáticas (1): Conceptos
• Prueba unitaria: una prueba individual de un método o clase.
• Prueba unitaria ad-hoc: por ejemplo, cuando creamos un objeto de
cierta clase con BlueJ e invocamos manualmente un método del mismo
con distintas entradas para ver si funciona.
• Sin embargo, con este tipo de pruebas no se puede trabajar eficiente y
sistemáticamente.
• Cada vez que cambiamos algo en el método o clase tendríamos que
volver a pasar todas las pruebas para asegurarnos de que “nada se ha
descabalado”. Es decir, realizar pruebas de regresión.
• Para ello, vendría muy bien algo que nos permitiera definir
sistemáticamente una serie de pruebas y ejecutarlas
automáticamente, tantas veces como necesitáramos.
• JUNIT nos permite hacer esto. JUNIT + BlueJ todavía mejor.
Febrero 2004
JUNIT. Pruebas Unitarias
3
Pruebas Unitarias Sistemáticas (2): Procedimiento
• Antes de implementar una determinada funcionalidad, piensa cómo
deberías probarla para verificar que se comporta correctamente. Esto
permite desarrollar la funcionalidad teniendo las ideas muy claras de lo
que debería hacer.
• Escribe el código que implementa la funcionalidad deseada.
• Escribe el código de las pruebas inmediatamente después.
• Ejecuta las pruebas que hiciste.
• Corrige la unidad de código que implementa la funcionalidad deseada
hasta que pase todas y cada una de las pruebas.
• Al añadir una nueva funcionalidad, repite el ciclo: piensa en cómo
probarla, codifica la funcionalidad, codifica las pruebas, ejecuta todas las
pruebas que hiciste (nuevas y viejas). No sigas hasta que el código pase
absolutamente todas las pruebas.
• Así una y otra vez para cada nueva funcionalidad que implementes. Lo
vemos con un ejemplo.
Febrero 2004
JUNIT. Pruebas Unitarias
4
2
Ejemplo Procedimiento Prueba con JUNIT (1)
• Desarrollar un método estático que tome un array de enteros como
argumento y devuelva el mayor valor encontrado en el array.
public class MayorNumero {
/**
* Devuelve el elemento de mayor valor de una lista
* @param list Un array de enteros
* @return
El entero de mayor valor de la lista
*/
public static int obt_mayorNumero(int lista[]) {
return 0; // para que compile hasta que desarrollemos el método
}
}
Febrero 2004
JUNIT. Pruebas Unitarias
5
Ejemplo Procedimiento Prueba con JUNIT (2)
• ¿Qué pruebas se te ocurren para el método obt_mayorNumero?
– ¿Qué ocurre para un array con valores cualesquiera (el caso
normal)?
[3, 7, 9, 8] → 9
– ¿Qué ocurre si el mayor elemento se encuentra al principio, en
medio o al final del array?
[9, 7, 8] → 9; [7, 9, 8] → 9; [7, 8, 9] → 9
– ¿Y si el mayor elemento se encuentra duplicado en el array?
[9, 7, 9, 8] → 9
– ¿Y si sólo hay un elemento en el array?
[7] → 7
– ¿Y si el array está compuesto por elementos negativos?
[-4, -6, -7, -22] → -4
Febrero 2004
JUNIT. Pruebas Unitarias
6
3
Ejemplo Procedimiento Prueba con JUNIT (3)
• Escribimos el código del método obt_mayorNumero:
/**
* Devuelve el elemento de mayor valor de una lista
*
* @param list Un array de enteros
* @return
*/
public static int obt_mayorNumero(int lista[]) {
El entero de mayor valor de la lista
int indice, max = Integer.MAX_VALUE;
for (indice = 0; indice < lista.length-1; indice++) {
if (lista[indice] > max) {
max = lista[indice];
}
}
return max;
}
Febrero 2004
JUNIT. Pruebas Unitarias
7
Ejemplo Procedimiento Prueba con JUNIT (4)
• Escribimos el código de las pruebas (1):
import junit.framework.*;
public class TestMayorNumero extends TestCase {
public TestMayorNumero() {
}
public void testSimple() {
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {3, 7, 9, 8}));
}
public void testOrden() {
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {9, 7, 8}));
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {7, 9, 8}));
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {7, 8, 9}));
}
// Sigue en la próxima transparencia
Febrero 2004
JUNIT. Pruebas Unitarias
8
4
Ejemplo Procedimiento Prueba con JUNIT (5)
• Escribimos el código de las pruebas (2):
// Sigue de la transparencia anterior
public void testDuplicados() {
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {9, 7, 9, 8}));
}
public void testSoloUno() {
assertEquals(7, MayorNumero.obt_mayorNumero(new int[] {7}));
}
public void testTodosNegativos() {
assertEquals(-4, MayorNumero.obt_mayorNumero(new int[] {-4, -6, -7, 22}));
}
} // Fin de la clase
Febrero 2004
JUNIT. Pruebas Unitarias
9
Ejemplo Procedimiento Prueba con JUNIT (6)
• Ejecutamos las pruebas:
Febrero 2004
JUNIT. Pruebas Unitarias
10
5
Ejemplo Procedimiento Prueba con JUNIT (7)
• Ejecutamos las pruebas:
Febrero 2004
JUNIT. Pruebas Unitarias
11
Ejemplo Procedimiento Prueba con JUNIT (8)
• ¿Qué está mal?:
PREGUNTAR A ALUMNOS
/**
* Devuelve el elemento de mayor valor de una lista
*
* @param list Un array de enteros
* @return
*/
public static int obt_mayorNumero(int lista[]) {
El entero de mayor valor de la lista
int indice, max = Integer.MAX_VALUE;
for (indice = 0; indice < lista.length-1; indice++) {
if (lista[indice] > max) {
max = lista[indice];
}
}
return max;
}
Febrero 2004
JUNIT. Pruebas Unitarias
12
6
Ejemplo Procedimiento Prueba con JUNIT (9)
• ¿Qué está mal?:
Integer.MIN_VALUE
/**
* Devuelve el elemento de mayor valor de una lista
*
* @param list Un array de enteros
* @return
*/
public static int obt_mayorNumero(int lista[]) {
El entero de mayor valor de la lista
int indice, max = Integer.MAX_VALUE;
for (indice = 0; indice < lista.length-1; indice++) {
if (lista[indice] > max) {
max = lista[indice];
}
}
return max;
}
Febrero 2004
JUNIT. Pruebas Unitarias
13
Ejemplo Procedimiento Prueba con JUNIT (10)
• Volvemos a ejecutar las pruebas (hasta que pasen todas):
Febrero 2004
JUNIT. Pruebas Unitarias
14
7
Ejemplo Procedimiento Prueba con JUNIT (11)
• ¿Qué está mal?:
public void testOrden() {
Falla en este “assert”, devuelve el 8 y no el 9
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {9, 7, 8}));
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {7, 9, 8}));
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {7, 8, 9}));
}
public static int obt_mayorNumero(int lista[]) {
int indice, max = Integer.MAX_VALUE;
for (indice = 0; indice < lista.length-1; indice++) {
if (lista[indice] > max) {
max = lista[indice];
}
}
return max;
}
PREGUNTAR A ALUMNOS
ejemplo de que siempre hay
que analizar los extremos
Febrero 2004
JUNIT. Pruebas Unitarias
15
Ejemplo Procedimiento Prueba con JUNIT (12)
• ¿Qué está mal?:
public void testOrden() {
Falla en este “assert”, devuelve el 8 y no el 9
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {9, 7, 8}));
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {7, 9, 8}));
assertEquals(9, MayorNumero.obt_mayorNumero(new int[] {7, 8, 9}));
}
lista.length
public static int obt_mayorNumero(int lista[]) {
int indice, max = Integer.MAX_VALUE;
for (indice = 0; indice < lista.length-1; indice++) {
if (lista[indice] > max) {
max = lista[indice];
}
}
return max;
}
Febrero 2004
JUNIT. Pruebas Unitarias
16
8
Ejemplo Procedimiento Prueba con JUNIT (13)
• Otra vez a ejecutar las pruebas (ahora ya pasan todas, podemos seguir):
Febrero 2004
JUNIT. Pruebas Unitarias
17
Ventajas de Probar Progresivamente
• Este método puede parecer extremo (casi es Extreme Programming),
pero normalmente ahorra tiempo y esfuerzo:
Si pruebas mientras desarrollas
Si desarrollas todo y al final pruebas
• Lo mejor es un término medio: cada funcionalidad significativa que
desarrolles pruébala antes de seguir.
Febrero 2004
JUNIT. Pruebas Unitarias
18
9
Pruebas con JUNIT: Explicación Formal (1)
Marco para desarrollar pruebas unitarias (1)
línea 1
-
línea 3
-
-
-
-
-
-
línea 10
-
-
-
-
línea 15
-
-
-
import junit.framework.*;
public class Pruebas extends TestCase {
// variables_privadas
public Pruebas ( ) {
// inicialización
}
public void testXXX ( ) {
// código para verificar que el método a probar funciona correctamente
}
public static void main (String[ ] args) {
junit.textui.TestRunner.run(Pruebas.class); // ejecución consola texto
// junit.swingui.TestRunner.run(Pruebas.class); // ejecución ventana
}
} // fin de clase
Febrero 2004
JUNIT. Pruebas Unitarias
19
Pruebas con JUNIT: Explicación Formal (2)
Marco para desarrollar pruebas unitarias (2):
a)
b)
(línea 1). Importar las clases de JUNIT necesarias.
(línea 3). Toda clase que contenga pruebas ha de heredar de la clase
“TestCase”. Ésta contiene la mayoría de funcionalidad necesaria para
realizar pruebas, incluyendo los “assert”.
(línea 10). Todo método que empiece por “test” en la clase será
ejecutado automáticamente por JUNIT. Así han de empezar todos
los métodos con casos de prueba.
c)
Otros detalles:
a) Cada método que sólo trate un caso o aspecto a probar.
b)
(línea 15). Si no usas BlueJ puedes ejecutar las pruebas por consola.
Febrero 2004
JUNIT. Pruebas Unitarias
20
10
Pruebas con JUNIT: Explicación Formal (3)
Métodos de comprobación (1):
assertEquals (valor_esperado, valor_real)
•
•
Comprueba si “valor_esperado” y “valor_real” son iguales.
“valor_real” es la salida que genera el mét
Comentarios de: JUNIT. Pruebas Unitarias (0)
No hay comentarios