Departamento de Lenguajes y Sistemas Informáticos escuela técnica superior de ingeniería informática Ingeniería del Software II Implementación metódica de contratos semánticos
Índice Introducción Ejemplo Queue Interfaz e implementación Contrato semántico Implementación del contrato Guía general Condiciones Automatización de las pruebas
Índice Introducción Ejemplo Queue Interfaz e implementación Contrato semántico Implementación del contrato Guía general Condiciones Automatización de las pruebas
Introducción Implementación metódica Características: Implementación en Java Contrato semántico como una decoración Evaluación de las condiciones con Asserts JUnit para la automatización de pruebas Trabajo en dos etapas Contrato sin modelo (hoy) Contrato con modelo (próxima clase)
Índice Introducción Ejemplo Queue Interfaz e implementación Contrato semántico Implementación del contrato Guía general Condiciones Automatización de las pruebas
Ejemplo Queue
Índice Introducción Ejemplo Queue Interfaz e implementación Contrato semántico Implementación del contrato Guía general Condiciones Automatización de las pruebas
Interfaz
public interface IQueue { Object first(); void append(Object o); void delete(); int size(); } IQueue.java
Posible implementación public class Queue implements IQueue { protected LinkedList q; // Ojo al protected public Queue() { q = new LinkedList(); } public Object first() { return q.getFirst(); } public void append(Object o) { q.addLast(o); }... Queue.java
Posible implementación... public void delete() { q.removeFirst(); } public int size() { return q.size(); } Queue.java
Índice Introducción Ejemplo Queue Interfaz e implementación Contrato semántico Implementación del contrato Guía general Condiciones Automatización de las pruebas
Contrato semántico contract IQueueSem on IQueue first, true // Lo cambiaremos en la siguiente clase result first() size() > true } append(o) == 0 ==> first() == > 0 ==> first() size() == + 1 }...
Contrato semántico... delete() size() > size() == – 1 } result size() result >= 0 } IQueue() { // Ojo, no visto en size() == 0 }
Implementación
Índice Introducción Ejemplo Queue Interfaz e implementación Contrato semántico Implementación del contrato Guía general Condiciones Automatización de las pruebas
Guía general
Llamada al método decorado... public void append(Object o) { if (nestingLevel == 0) pre$append(o); pre$append$size = obj.size(); if (pre$append$size > 0) pre$append$first = obj.first(); nestingLevel++; obj.append(o); nestingLevel--; if (nestingLevel == 0) { post$append(o); queue$inv(); }... QueueSem.java
llamada a la Pre/Post e invariante... public void append(Object o) { if (nestingLevel == 0) pre$append(o); pre$append$size = obj.size(); if (pre$append$size > 0) pre$append$first = obj.first(); nestingLevel++; obj.append(o); nestingLevel--; if (nestingLevel == 0) { post$append(o); queue$inv(); }... QueueSem.java
Semántica transaccional... public void append(Object o) { if (nestingLevel == 0) pre$append(o); pre$append$size = obj.size(); if (pre$append$size > 0) pre$append$first = obj.first(); nestingLevel++; obj.append(o); nestingLevel--; if (nestingLevel == 0) { post$append(o); queue$inv(); }... QueueSem.java
Evaluación del preestado... public void append(Object o) { if (nestingLevel == 0) pre$append(o); pre$append$size = obj.size(); if (pre$append$size > 0) pre$append$first = obj.first(); nestingLevel++; obj.append(o); nestingLevel--; if (nestingLevel == 0) { post$append(o); queue$inv(); }... QueueSem.java
Índice Introducción Ejemplo Queue Interfaz e implementación Contrato semántico Implementación del contrato Guía general Condiciones Automatización de las pruebas
Condiciones Usaremos AssertTrue definido en JUnit ( junit.framework.Assert ) para evaluar condiciones Evalua condition, si es falsa, lanza la excepción AssertionFailedError con el mensaje message Las condiciones se expresan en Java public static void assertTrue(String message, boolean condition)
Precondiciones... private void pre$append(Object o) { true", true); }... QueueSem.java
Postcondiciones... private void post$append(Object o) { Assert.assertTrue( size() == + 1", obj.size() == pre$append$size + 1); Assert.assertTrue( == 0 ==> first() == o”, !(pre$append$size == 0) || obj.first() == o); Assert.assertTrue( > 0 ==> first() == !(pre$append$size > 0) || obj.first() == pre$append$first); }... QueueSem.java
Invariantes... private void queue$inv(Object o) { true", true); }... QueueSem.java
Condiciones iniciales... private void queue$init(Object o) { size()==0", obj.size()==0); }... public QueueSem(IQueueModel obj) { this.obj = obj; nestingLevel = 0; queue$init(); }... QueueSem.java
Índice Introducción Ejemplo Queue Interfaz Modelo Contrato semántico Implementación del contrato Guía general Condiciones Automatización de las pruebas
Automatización de las pruebas Incluir la biblioteca: eclipse\plugins\org.junit_3.8.1 Definir una clase de prueba que extienda junit.framework.TestCase, donde se defina un posible escenario de uso de la interfaz Ejecutar la prueba: Run/Run As/Junit Test
Pruebas public class TestsQueue extends TestCase { public void testFirst1() { IQueue q = new QueueSem(new Queue()); String e0 = "Cadena 0"; q.append(e0); } public void testFirst2() { IQueue q = new QueueSem(new Queue()); q.first(); }... } TestsQueue.java
!Gracias! ¿Podemos mejorar esta lección? Escríbenos al foro de la asignatura Visita la web de la asignatura