Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porAsunción Valenzuela Peña Modificado hace 7 años
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
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.