La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


Presentación del tema: "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."— Transcripción de la presentación:

1 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

2 Í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

3 Í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

4 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)

5 Í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

6 Ejemplo Queue

7 Í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

8 Interfaz

9 public interface IQueue { Object first(); void append(Object o); void delete(); int size(); } IQueue.java

10 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

11 Posible implementación... public void delete() { q.removeFirst(); } public int size() { return q.size(); } Queue.java

12 Í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

13 Contrato semántico contract IQueueSem on IQueue { @query first, size @inv true // Lo cambiaremos en la siguiente clase result first() { @pre size() > 0 @post true } append(o) { @pre true @post size()@pre == 0 ==> first() == o @post size()@pre > 0 ==> first() == first()@pre @post size() == size()@pre + 1 }...

14 Contrato semántico... delete() { @pre size() > 0 @post size() == size()@pre – 1 } result size() { @pre true @post result >= 0 } IQueue() { // Ojo, no visto en teoría @post size() == 0 }

15 Implementación

16 Í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

17 Guía general

18 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

19 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

20 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

21 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

22 Í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

23 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)

24 Precondiciones... private void pre$append(Object o) { Assert.assertTrue("@pre true", true); }... QueueSem.java

25 Postcondiciones... private void post$append(Object o) { Assert.assertTrue( "@post size() == size()@pre + 1", obj.size() == pre$append$size + 1); Assert.assertTrue( "@post size()@pre == 0 ==> first() == o”, !(pre$append$size == 0) || obj.first() == o); Assert.assertTrue( "@post size()@pre > 0 ==> first() == first()@pre”, !(pre$append$size > 0) || obj.first() == pre$append$first); }... QueueSem.java

26 Invariantes... private void queue$inv(Object o) { Assert.assertTrue("@inv true", true); }... QueueSem.java

27 Condiciones iniciales... private void queue$init(Object o) { Assert.assertTrue("@post size()==0", obj.size()==0); }... public QueueSem(IQueueModel obj) { this.obj = obj; nestingLevel = 0; queue$init(); }... QueueSem.java

28 Índice Introducción Ejemplo Queue Interfaz Modelo Contrato semántico Implementación del contrato Guía general Condiciones Automatización de las pruebas

29 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

30 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

31 !Gracias! ¿Podemos mejorar esta lección? Escríbenos al foro de la asignatura Visita la web de la asignatura


Descargar ppt "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."

Presentaciones similares


Anuncios Google