Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 2 dit UPM {F-PROG} l Por obligación (javadoc): n...
Transcript of Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 2 dit UPM {F-PROG} l Por obligación (javadoc): n...
1
dit UPM
{F-PROG}
l Estilo l Documentación l Pruebas l Depuración
Contenido
1 Fundamentos de Programación DIT-UPM
dit UPM
{F-PROG}
l Comentarios de código n /* ...
*/ n // comentario táctico: hasta fin de línea
l Comentarios de documentación n /**
**/ l Herramienta javadoc para generar páginas
HTML de documentación
Comentarios
2 Fundamentos de Programación DIT-UPM
2
dit UPM
{F-PROG}
l Por obligación (javadoc): n al principio de cada clase n al principio de cada método n ante cada campo
l Por conveniencia (una línea): n al principio de fragmento de código no evidente n a lo largo de los bucles
l Y por si acaso (una línea): n siempre que hagamos algo raro n siempre que el código no sea evidente
Comentarios
3 Fundamentos de Programación DIT-UPM
dit UPM
{F-PROG}
l Tras los “imports” y antes del “class” import java.util.List; /** * Esta clase representa... * @author Pepe Pérez * @version 2 (22-2-2004) **/ public class Autor extends Persona{ }
Comentarios de clase
4 Fundamentos de Programación DIT-UPM
3
dit UPM
{F-PROG}
l @author nombre del autor l @version identificación de la versión y fecha l @see referencia a otras clases y métodos
l @since indica desde qué versión o fecha existe esta clase o interfaz en el paquete
l @deprecated esta clase no debería usarse pues puede desaparecer en próximas versiones
Comentarios de documentación de clase
5 Fundamentos de Programación DIT-UPM
dit UPM
{F-PROG}
l Justo antes de su definición /** * Nombre del alumno **/ private int nombre;
Comentarios de atributos
6 Fundamentos de Programación DIT-UPM
4
dit UPM
{F-PROG}
l @since indica desde qué versión o fecha existe este atributo en la clase
l @deprecated este atributo no debería usarse pues puede desaparecer en próximas versiones
Comentarios de documentación de atributos
7 Fundamentos de Programación DIT-UPM
dit UPM
{F-PROG}
l Justo antes de su definición /** * Inserta elemento en la lista el número de veces indicado. Lanza una
excepción si la lista está llena y devuelve la posición del primer elemento insertado.
* @param elemento Elemento que se desea insertar * @param repetidos Int con el número de veces que se inserta * @throws Exception si lista está llena * @return Posición del primer elemento **/ int inserta(Elemento elemento, int repetidos) throws Exception {}
Comentarios de métodos
8 Fundamentos de Programación DIT-UPM
5
dit UPM
{F-PROG}
l @param <nombre del parámetro> descripción de su significado y uso
l @return descripción de lo que se devuelve l @exception <nombre de la excepción>
excepciones que pueden lanzarse l @since indica desde qué versión o fecha existe
este constructor o método en la clase l @deprecated este método no debería usarse
pues puede desaparecer en próximas versiones
Comentarios de documentación de métodos
9 Fundamentos de Programación DIT-UPM
dit UPM
{F-PROG}
l Valen para detectar errores l Una prueba es tanto mejor
cuantos menos errores pasan desapercibidos l Hay que programar, ejecutar y documentar las
pruebas antes de dar por acabado una clase l Permiten ver cómo se usa la clase l Al hacer pruebas hay que intentar que falle el
programa o la clase por todos los medios l Normalmente hay que hacer varias pruebas:
una batería de pruebas
Pruebas
10 Fundamentos de Programación DIT-UPM
6
dit UPM
{F-PROG}
l Pruebas unitarias: prueban el menor elemento posible, una clase o un método
l Pruebas de integración: interacción entre clases o paquetes
l Pruebas de sistema: prueban el programa en contexto real
l Pruebas de aceptación: prueba del programa para ver que satisface los requisitos
Tipos de pruebas funcionales
11 Fundamentos de Programación DIT-UPM
dit UPM
{F-PROG}
l De caja negra n cuando conocemos la parte pública de una clase
l De caja blanca n cuando conocemos la parte privada y forzamos la
ejecución de todo el código
Enfoques de prueba
12 Fundamentos de Programación DIT-UPM
7
dit UPM
{F-PROG}
l ¿Qué hay que probar? n ejecutar al menos una vez cada sentencia
n cobertura de sentencias
n ejecutar al menos una vez cada condición con resultado cierto y falso
n cobertura de ramas
l Método n si va tachando el código probado
100% es cuando todo esté tachado
Casos de prueba
13 Fundamentos de Programación DIT-UPM
dit UPM
{F-PROG}
l if (...) n si T, si F
l switch (...) n cada ‘case’ + ‘default’
l cobertura de bucles n for -> 3 pruebas: 0 veces, 1 vez, n>1 veces n repeat -> 2 pruebas: 1 vez, n>1 veces n while -> 3 pruebas: 0 veces, 1 vez, n>1 veces
Casos de prueba
14 Fundamentos de Programación DIT-UPM
8
dit UPM
{F-PROG}
l ¿Con qué datos se prueba? – divida el espacio de datos en clases de equivalencia
n clase de equivalencia: datos que provocan el “mismo comportamiento”
n no parece que deban provocar comportamientos diferentes – elija un dato “normal” de clase de equivalencia – pruebe con todos los datos “frontera”:
valores extremos de la clase de equivalencia
l Añada aquellos casos en los que sospeche que el programador puede haberse equivocado
l Pruebe todas las combinaciones { datos × comportamiento }
Datos de prueba
15 Fundamentos de Programación DIT-UPM
dit UPM
{F-PROG}
l Junit es una biblioteca de clases para ayudar a programar y ejecutar pruebas unitarias
l Para probar una clase hay que crear otra clase de prueba que extienda a junit.framework.TestCase l Para probar Punto, la clase de prueba es TestPunto
l Por cada método de la clase bajo pruebas se escriben varios métodos en la clase de prueba
Pruebas automáticas
16 Fundamentos de Programación DIT-UPM
9
dit UPM
{F-PROG} Prueba con JUnit 4.x
l Importar clases JUnit import org.junit.*; import static org.junit.Assert.*;
(import static: para referenciar métodos/atributos sin citar la clase)
l Declarar clase de prueba (normal) public class MiClaseTest {
l Declarar variables para prueba: MiClase c;…
l Uso de anotaciones (metadatos) @... n Instrucciones para el compilador y otras herramientas n Igual que para JavaDoc: (@author, @param...)
Fundamentos de Programación DIT-UPM 17
dit UPM
{F-PROG} Anotación de métodos
l @Test: método que representa un caso de prueba n Comprueba si el resultado esperado es igual al real n Métodos Assert: assertTrue, assertFalse, assertEquals, assertNull,
assertNotNull, assertSame, assertNotSame
l @Before/@After: métodos que deben ejecutarse antes/después de cualquier caso de prueba
l @BeforeClass/@AfterClass: se ejecutan una vez, antes/después de todos los test de la clase n Puede haber varios métodos etiquetados con
@Before y @After n Solo un @BeforeClass y un @AfterClass
Fundamentos de Programación DIT-UPM 18
10
dit UPM
{F-PROG}
Supongamos que queremos probar la clase Contador l public class ContadorTest {
n Esta es la prueba unitaria de la clase Contador; declara los objetos necesarios para una o más pruebas
l public void setUp() n Define las condiciones iniciales de cada prueba, inicializando los
objetos y recursos necesarios l public void tearDown()
n Libera los recursos del sistema empleados en la inicialización l public void testPrueba1(),
public void testPrueba2(), etc. Métodos para cada prueba }
Clase de prueba
19 Fundamentos de Programación DIT-UPM
dit UPM
{F-PROG}
l Cada método público que comienza por test es un método de prueba n Llama al método que se desea probar y obtiene el resultado n Comprueba que el resultado es el esperado n Se repiten estos pasos tantas veces como sea necesario
static void assertEquals(esperado, obtenido) Comprueba si los objetos (o variables de tipo primitivo) son iguales, empleando el método equals() si está definido. Si no, emplea ==
Cada prueba prueba una sóla cosa => un solo assert
Métodos de clase de prueba
20 Fundamentos de Programación DIT-UPM
11
dit UPM
{F-PROG} Clase bajo pruebas
21 Fundamentos de Programación DIT-UPM
public class Contador { private int contador = 0; public int incrementa() { return ++contador; } public int decrement() { return --contador; }
public int getContador() { return contador; } }
Los métodos triviales como getContador() no necesitan prueba asociada.
dit UPM
{F-PROG} Clase de prueba
22 Fundamentos de Programación DIT-UPM
import org.junit.After; import org.junit.Before;
public class ContadorTest { private Contador miContador;
@Before public void setUp() { // crea un (simple) escenario
miContador = new Contador(); }
@After
public void tearDown() { } // no hay recursos que liberar
@Test public void testIncrementa() {
assertEquals(1, miContador.incrementa()); assertEquals(2, miContador.incrementa()); }
@test public void testDecrementa() { assertEquals(-1, miContador.decrementa()); } }
Cada prueba comienza con un contador nuevo, con lo que no hay que preocuparse del orden de las pruebas
12
dit UPM
{F-PROG} Inicialización y cierre
23 Fundamentos de Programación DIT-UPM
l Se pueden poner métodos para envolver las pruebas (crear y liberar fixtures):
public void setUp() { ...; } public void tearDown() { ...; }
setUp()
test001()
tearDown()
setUp()
test002()
tearDown()
setUp()
test003()
tearDown()
dit UPM
{F-PROG}
l assertTrue(boolean comprobación) Éxito si la comprobación es cierta
l assertFalse(boolean comprobación) Éxito si la comprobación es falsa
l assertSame (Objeto esperado, Objeto obtenido) Éxito si referencias iguales empleando ==
l assertNotSame(Objeto esperado, Objeto obtenido) Éxito si los dos objetos no se refieren al mismo objeto
l assertNull(Objeto objeto) Éxito si el objeto es null
l assertNotNull(Objeto osperado, Objeto obtenido) Éxito si el objeto no es null
l fail(String mensaje) Causa fallo en la prueba. Para comprobar si una excepción se lanza y se captura.
Comprobaciones
24 Fundamentos de Programación DIT-UPM
13
dit UPM
{F-PROG} Ejemplo fail
25 Fundamentos de Programación DIT-UPM
public void testDecrementaLanzaExcepcion() { try { miContador.decrementa(); fail("No lanza la excepcion con contador" + miContador.getContador()); } catch (ContadorException e){ // ok } catch (Exception e) { fail(“Lanza excepción que no es ContadorException”); } }
dit UPM
{F-PROG} Ejemplo de fail
26 Fundamentos de Programación DIT-UPM
public void testDecrementaSinExcepcion0(){ try { miContador.incrementa(); miContador.decrementa(); //contador vale 0 } catch (Exception e) { fail("Lanza la excepcion y contador vale " + miContador.getContador()); } }