Publicado el 19 de Enero del 2019
544 visualizaciones desde el 19 de Enero del 2019
2,6 MB
32 paginas
Programación
Tema 8: Estilo y pruebas
Programación DIT-UPM
1
Contenidos
! Estilo
! Pruebas
! Depuración
Programación DIT-UPM
2
Calidad del Software
! Estilo, prueba, depuración: aspectos
relacionados con el…
! Aseguramiento de la Calidad del Software
(QA, Quality Assurance):
Conjunto de políticas y actividades para:
" Definir objetivos de calidad
" Ayudar a asegurar que los productos y procesos
software cumplen esos objetivos
" Saber en qué medida lo hacen
" Mejorar la calidad progresivamente
Programación DIT-UPM
3
Estilo de código
! Comprensible
! Cohesión
! Desacoplamiento
! Formato (sangrado…)
! Nombres consistentes
! Ocultamiento de información
! Comentarios significativos
Programación DIT-UPM
4
Estilo: objetivos
! Disminuir errores
! Asegurar legibilidad
" El código se escribe para ser leído por otros
(no solo por el compilador)
! Abaratar/facilitar mantenimiento
! Estándares de codificación en Java:
" The Elements of Java Style
Vermeulen et.al. SIGS Books
Programación DIT-UPM
5
Estilo: reglas generales
! Simplicidad
! Claridad
" Clases y métodos simples
" Propósito claro de cada elemento: dónde, cuándo, porqué y cómo
usarlo
! Completitud
! Consistencia
! Robustez
" Documentar todos los aspectos necesarios
" Entidades similares deben tener aspecto y comportamiento similar
" Comportamiento predecible y documentado en respuesta a errores y
excepciones
" No ocultar errores, ni forzar a los clientes a descubrirlos
Programación DIT-UPM
6
Estilo: nombrado
! Clases, Interfaces: Mayuscula-Mayuscula
" Ej. Punto, PolinomioGrado2
! Métodos: minuscula-Mayuscula
" Ej. getX(), distancia(), buscaMayor()
! Atributos: minuscula-Mayuscula
" Ej. nombrePropio, x, y, apellidos
! Constantes: MAYUSCULA + “_”
" Ej. ORIGEN_X
! Evitar nombres con caracteres acentuados, ü, ñ
Programación DIT-UPM
Estilo: parámetros
! Orden de parámetros:
" Entrada/modificación/salida
" Consistente en todos los métodos
! Usar todos los parámetros
! Limitar número de parámetros (nunca >7)
! Documentar suposiciones sobre parámetros:
" Tipo de acceso, unidades, rangos, valores no
válidos
Programación DIT-UPM
8
Estilo: comentarios
! Comentarios de código
/* ...
*/
// comentario táctico: hasta fin de línea
! Comentarios de documentación
/**
**/
! Herramienta javadoc para generar páginas
HTML de documentación (ya explicado)
Programación DIT-UPM
Contenidos
! Estilo
! Pruebas
! Depuración
Programación DIT-UPM
10
Pruebas
! Valen para detectar errores
! Una prueba es tanto mejor
cuantos menos errores pasan desapercibidos
! Hay que programar, ejecutar y documentar las
pruebas antes de dar por acabado una clase
! Permiten ver cómo se usa la clase
! Al hacer pruebas hay que intentar que falle el
programa o la clase por todos los medios
! Normalmente hay que hacer varias pruebas:
una batería de pruebas
Programación DIT-UPM
Tipos de pruebas
funcionales
! Pruebas unitarias: prueban el menor elemento
posible, una clase o un método
! Pruebas de integración: interacción entre
! Pruebas de sistema: prueban el programa en
clases o paquetes
contexto real
! Pruebas de aceptación: prueba del programa
para ver que satisface los requisitos
Programación DIT-UPM
Enfoques de prueba
! De caja negra
" cuando conocemos la parte pública de una clase
! De caja blanca
" cuando conocemos la parte privada y forzamos la
ejecución de todo el código
Programación DIT-UPM
Casos de prueba
! ¿Qué hay que probar?
" ejecutar al menos una vez cada sentencia
# cobertura de sentencias
" ejecutar al menos una vez cada condición
con resultado cierto y falso
# cobertura de ramas
! Método
" si va tachando el código probado
100% cuando todo esté tachado
Programación DIT-UPM
Casos de prueba
! if (...)
" si T, si F
! switch (...)
" cada ‘case’ + ‘default’
! cobertura de bucles
" for -> 3 pruebas: 0 veces, 1 vez, n>1 veces
" repeat -> 2 pruebas: 1 vez, n>1 veces
" while -> 3 pruebas: 0 veces, 1 vez, n>1 veces
Programación DIT-UPM
Datos de prueba
! ¿Con qué datos se prueba?
–
–
–
divida el espacio de datos en clases de equivalencia
"
clase de equivalencia:
datos que provocan el “mismo comportamiento”
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
! Añada aquellos casos en los que sospeche que el
programador puede haberse equivocado
! Pruebe todas las combinaciones
{ datos × comportamiento }
Programación DIT-UPM
Pruebas automáticas: JUnit
! Framework para pruebas unitarias de clases
! Facilita la escritura de pruebas
! Automatiza su ejecución
! Uso independiente (desde línea de comandos) o
integrado en IDEs (Eclipse, Netbeans)
! Autores: Kent Beck and Erich Gamma.
! Web: junit.org
! Versión estable: 4.11 (nov.2012)
Programación DIT-UPM
Casos de prueba
! Conjunto de métodos java (anotados):
" secuencia de operaciones, entradas y valores
esperados (escritos por quien prueba)
" Sustituyen el uso de main() para probar
! Añade aserciones (clase) para comprobar:
" Si dos objetos son iguales
" si dos referencias a objetos son idénticas
" Si una referencia a un objeto es nula o no
Programación DIT-UPM
18
Prueba con JUnit 4.x
! Importar clases JUnit
!import org.junit.*;
import static org.junit.Assert.*;!
(import static: para referenciar métodos/atributos sin citar la clase)!
! Declarar clase de prueba (normal)
!public class MiClaseTest {
! Declarar variables para prueba:
!MiClase c;…
! Uso de anotaciones (metadatos) @...
" Instrucciones para el compilador y otras herramientas
" Igual que para JavaDoc: (@author, @param...)
Programación DIT-UPM
19
Anotación de métodos
! @Test: método que representa un caso de prueba
" Comprueba si el resultado esperado es igual al real
" Métodos Assert: assertTrue, assertFalse, assertEquals,
assertNull, assertNotNull, assertSame, assertNotSame
! @Before/@After: métodos que deben ejecutarse
antes/después de cualquier caso de prueba
! @BeforeClass/@AfterClass: se ejecutan una
vez, antes/después de todos los test de la clase
" Puede haber varios métodos etiquetados con
@Before y @After
" Solo un @BeforeClass y un @AfterClass
Programación DIT-UPM
20
Ejemplo 1
import org.junit.*;
import static org.junit.Assert.*;
@Before
public void setUp() {
ej = new ClaseEjemplo();
}
@Test
public void testSuma( ) {
int a=3 , b=6;
int resultEsperado = (a+b);
int resultReal = ej.suma(a, b);
assertEquals(reusultEsperado, resultReal);
}
@After
public void tearDown() {
ej = null;
}
Programación DIT-UPM
21
Métodos de clase de prueba
! Sugerencia: nombrar métodos que comiencen
por test
" Llama al método que se desea probar y obtiene el
resultado
" Comprueba que el resultado es el esperado
" Se repiten estos pasos tantas veces como sea
necesario
Programación DIT-UPM
Aserciones
! 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 ==
! assertArrayEquals (esperado, obtenido)
" arrays de la misma longitud
" para cada valor del índice, se comprueba:
assertEquals(expected[i],actual[i])
o
assertArrayEquals(expected[i],actual[i])
Programación DIT-UPM
23
Aserciones (cont.)
! assertTrue (boolean comprobacion) - assertFalse
" Éxito si la comprobación es cierta (falsa)
! assertSame (Objeto esperado, Objeto obtenido) -
assertNotSame
" Éxito si referencias iguales empleando == (o distintas)
! assertNull (Objeto objeto)
" Éxito si el objeto es null (o no lo es)
! fail (String mensaje)
" Causa fallo en la prueba. Para comprobar si una excepción se
lanza y se captura.
Programación DIT-UPM
Ejemplo 2
Los métodos triviales
como getContador() no
necesitan prueba
asociada.
public class Contador {
private int contador = 0;
public int incrementa() {
return ++contador;
}
public int decrementa() {
return --contador;
}
public int getContador() {
return contador;
}
}
Programación DIT-UPM
Ejemplo 2 (cont)
import static org.junit.Assert.*;
public class TestContador {
private Contador miContador;
@Before
public void setUp() throws Exception {
miContador= new Contador();}
@After
public void tearDown() throws Exception {}
@Test
public void testIncrementa1() {
assertEquals(1, miContador.incrementa());}
@Test
public void testIncrementa2() {
miContador.incrementa();
assertEquals(2, miContador.incrementa());}
Cada prueba comienza con
un contador nuevo, con lo
que no hay que preocuparse
del orden de las pruebas
Cada prueba permite
comprobar un elemento
específico=> un assert
@Test
}
public void testDecrementa() {
}
assertEquals(-1, miContador.decrementa());
Programación DIT-UPM
Aserciones: mensajes
! Cualquier aserción tiene una signatura adicional
con un parámetro String inicial.
" Es un mensaje adicional que se incluirá en el
mensaje de fallo (si lo hubiera)
! Ejemplos:
assertTrue (mensaje, comprobacion)
assertEquals (mensaje, esperado, real)
Programación DIT-UPM
27
Aserciones sobre reales
! En la comparación de resultados reales se
requiere un parámetro adicional (delta)
" Para evitar problemas de redondeo, se evalúa:
Math.abs( resEsperado – resReal) <= delta
! Ejemplo:
assertEquals (resEsperado, resReal, 0.0001)
Programación DIT-UPM
28
Prueba de excepciones
! Pasando parámetro a la anotación @Test con
@Test(expected=ImporteNoDisponibleException.class)
el tipo de exce
Comentarios de: Tema 8: Estilo y pruebas - Programación (0)
No hay comentarios