Publicado el 14 de Enero del 2017
751 visualizaciones desde el 14 de Enero del 2017
181,5 KB
55 paginas
Creado hace 15a (27/10/2009)
Tema 4: Corrección y Robustez en Java
Programación Orientada a Objetos
Curso 2009/2010
Begoña Moros Valle
Contenido
Introducción
Corrección:
Asertos
Pruebas unitarias
Robustez:
Excepciones
Diseño por contrato
Consejos uso de excepciones
Tema4
Corrección y Robustez
2
Introducción
Corrección:
Es la capacidad de los productos software de realizar
con exactitud su tarea (cumplir su
especificación).
Robustez:
Es la capacidad de los productos software de
reaccionar adecuadamente ante situaciones
excepcionales.
La reutilización y extensibilidad no deben
lograrse a expensas de la fiabilidad (corrección
y robustez).
Tema4
Corrección y Robustez
3
Especificación
La especificación (formal) de la semántica de
una rutina está definida por:
Precondiciones: condiciones para que una rutina
funcione correctamente.
Postcondiciones: describen el efecto de la rutina.
El estado que deben cumplir los objetos de una
clase se denomina invariante.
Restricciones que deben ser satisfechas por cada
objeto tras la ejecución de los métodos y
constructores.
Tema4
Corrección y Robustez
4
Asertos y excepciones
Java proporciona dos herramientas para
tratar con la corrección y robustez del
código:
Aserto: condición que debe cumplirse en el
código.
Excepción: mecanismo para notificar un
error durante la ejecución.
Tema4
Corrección y Robustez
5
Caso de estudio
Clase Cuenta:
El estado de una cuenta es correcto si tiene un
titular (referencia no nula) invariante
El método ingreso() incrementa el saldo de la
cuenta postcondición
El parámetro del método ingreso() debe ser
siempre positivo precondición
El método ingreso() sólo se puede ejecutar en
estado OPERATIVA precondición
Cada cuenta tiene un código diferente.
¿Cómo comprobamos la corrección del código?
Tema4
Corrección y Robustez
6
Clase Cuenta
public class Cuenta {
private static int ultimoCodigo = 0;
private int codigo;
private double saldo;
private final Persona titular;
private EstadoCuenta estado;
public Cuenta(Persona persona, int saldoInicial) {
codigo = ++ultimoCodigo;
saldo = saldoInicial;
titular = persona;
estado = EstadoCuenta.OPERATIVA;
}
public void ingreso(double cantidad) {
saldo = saldo + cantidad;
}
…
}
Tema4
Corrección y Robustez
7
Asertos
Construcción proporcionada por el lenguaje que
permite comprobar si una condición se cumple en
el código.
Declaración de un aserto:
assert expresión booleana;
assert expresión booleana: “mensaje de error”;
La violación de un aserto (evaluación false)
provoca un error en la aplicación notificado con una
excepción (AssertError).
Se pueden incluir asertos en cualquier punto del
código donde queramos asegurar que se cumple una
condición útil para depuración.
Tema4
Corrección y Robustez
8
Asertos
Los asertos puede utilizarse para comprobar la
Pre y postcondiciones del método ingreso():
corrección del código.
/**
* Ingresa una cantidad en una cuenta operativa
* @param cantidad valor mayor o igual que cero.
*/
public void ingreso (double cantidad) {
assert cantidad >= 0: "cantidad negativa";
assert estado == EstadoCuenta.OPERATIVA: "estado incorrecto";
saldo = saldo + cantidad;
assert saldo == old saldo + cantidad: "Fallo postcondición";
}
Tema4
Corrección y Robustez
9
Asertos
Postcondición:
El código anterior no compila, ya que no es posible
expresar con un aserto el antiguo valor de un
atributo (old saldo).
Para expresar correctamente el aserto deberíamos
declarar una variable local para almacenar el
antiguo valor del atributo.
Invariante:
Podría definirse en un método privado que sea
comprobado al final de cada método y constructor.
private boolean invariante() {
return titular != null;
}
Tema4
Corrección y Robustez
10
Asertos
/**
* Ingresa una cantidad en una cuenta operativa.
* @param cantidad valor mayor o igual que cero.
*/
public void ingreso (double cantidad) {
assert cantidad >= 0: "cantidad negativa";
assert estado == EstadoCuenta.OPERATIVA: "estado incorrecto";
double oldSaldo = saldo;
saldo = saldo + cantidad;
assert saldo == oldSaldo + cantidad: "Fallo postcondición";
assert invariante(): "Fallo invariante";
}
Tema4
Corrección y Robustez
11
Asertos. Inconvenientes
Los asertos en Java son pobres.
Por ejemplo, no podemos establecer en un aserto el
antiguo valor de un atributo (old saldo).
No permite utilizar cuantificadores lógicos
ni condiciones globales a una clase.
Por ejemplo, “cada cuenta debe tener un código
único”.
Un aserto sólo es comprobado durante la
ejecución del código.
Los asertos no se heredan.
Por defecto, los asertos están desactivados.
Se activan con el parámetro -ea de la máquina
No podemos confiar en los asertos para
controlar las precondiciones!!
Tema4
Corrección y Robustez
virtual.
12
Verificación y Pruebas
Verificación: proceso que comprueba que el
La verificación puede ser formal (lenguajes
código sea correcto.
algebraicos, Maude)
Las pruebas del software permiten realizar la
verificación no formal del código.
Hay varios tipos de pruebas. Las más
relevantes para las clases son las pruebas
unitarias.
Java no incluye en el lenguaje soporte para
pruebas unitarias.
Se utiliza una herramienta externa encargada
de hacer las pruebas: JUnit.
Tema4
Corrección y Robustez
13
Pruebas Unitarias
Pruebas encargadas de probar el funcionamiento de
un módulo (clase) de la aplicación.
Una prueba unitaria adopta el rol del cliente de la
clase y comprueba si los constructores y métodos
realizan lo que se espera de ellos (postcondiciones).
La ejecución de las pruebas puede ser
automatizada.
Es posible definir baterías de pruebas (suite) que
ejecuten todas las pruebas de una aplicación.
Habitualmente se define una prueba unitaria (clase de
pruebas) por cada clase de la aplicación.
Tema4
Corrección y Robustez
14
JUnit- Asertos
La herramienta JUnit define métodos para
establecer asertos sobre el código:
assertEquals() : comprueba que dos valores sean
iguales.
assertNotEquals() : dos valores son distintos.
assertSame() : dos objetos son idénticos.
assertTrue() : validez de una expresión booleana.
assertNotNull() : referencia no nula.
…
Tema4
Corrección y Robustez
15
JUnit- Pruebas de la clase Cuenta
Se crean métodos de prueba para los constructores y
métodos que cambien el estado del objeto.
import junit.framework.TestCase;
public class CuentaTest extends TestCase {
public void testIngreso() {
Persona cliente =
new Persona ("Juan González", "33435332");
Cuenta cuenta = new Cuenta (cliente, 100);
cuenta.ingreso(100);
assertEquals(200, cuenta.getSaldo());
}
}
Tema4
Corrección y Robustez
16
JUnit – Objetos de prueba
Para evitar la repetición del código que
construye los objetos de prueba:
Se declaran como atributos de la clase de pruebas.
El método setUp() se encarga de construir los
objetos de prueba.
El método setUp() se ejecuta antes de cada
método de prueba.
Se asegura que los objetos de prueba siempre
estén recién construidos antes de cada prueba.
Los métodos de prueba no interfieren entre sí.
Tema4
Corrección y Robustez
17
JUnit – Método setUp()
public class CuentaTest extends TestCase {
private Cuenta cuenta;
@Override
protected void setUp() {
Persona cliente =
new Persona ("Juan González", "33435332");
cuenta = new Cuenta (cliente, 100);
}
public void testIngreso() {
cuenta.ingreso(100);
assertEquals(200, cuenta.getSaldo());
Corrección y Robustez
18
}
Tema4
JUnit – Batería de pruebas
Se añaden todas las clases de pruebas de la
aplicación.
import junit.framework.Test;
import junit.framework.TestSuite;
public class AllTests {
public static Test suite() {
TestSuite suite =
new TestSuite("Test aplicación bancaria");
suite.addTestSuite(CuentaTest.class);
suite.addTestSuite(DepositoTest.class);
return suite;
Corrección y Robustez
19
}
}
Tema4
Beneficios de las pruebas
Las pruebas se ejecutan automáticamente:
No es necesario que una persona interaccione con la
interfaz de la aplicación introduciendo valores de
prueba.
Las pruebas comprueban el
comportamiento esperado de una operación
sin importar cómo ha sido implementada.
Los cambios en la implementación que mejoren la calidad
del código (refactorización) no afectan a las pruebas.
Soporte para la extensibilidad:
Tras añadir una nueva funcionalidad a la aplicación
las pruebas permiten comprobar que todo el código
anterior funciona correctamente.
Tema4
Corrección y Robustez
20
Excepciones
Mecanismo proporcionado por el lenguaje de
programación para notificar errores en
tiempo de ejecución.
Soporte para la robustez del código.
La información del error, excepción, es un
objeto que se propaga a todos los objetos
afectados por el error.
Las excepciones pueden tratarse con el
propósito de dar una solución al error:
recuperación de errores.
Tema4
Corrección y Robustez
21
Situaciones de error
Habitualmente las excepciones se utilizan en
situaciones de error que no pueden ser
resueltas por el pr
Comentarios de: Tema 4: Corrección y Robustez en Java (0)
No hay comentarios