contenido - upmmmiguel/doc/fprg/tema8_tmp.pdf · 2 dit upm {f-prog} l por obligación (javadoc): n...

13
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

Upload: others

Post on 30-Jun-2020

15 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 2: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 3: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 4: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 5: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 6: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 7: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 8: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 9: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 10: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 11: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 12: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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

Page 13: Contenido - UPMmmiguel/doc/fprg/Tema8_tmp.pdf · 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

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());   } }