Download Lab 1. El contrato de una cola

Document related concepts
no text concepts found
Transcript
escuela técnica superior
de ingeniería informática
Implementación
metódica de
contratos semánticos
Departamento de
Lenguajes y Sistemas Informáticos
Ingeniería del Software II
Í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
<< interface >>
IQueue
+first():Object
+append(o:Object):void
+delete():void
+size():int
- obj
Queue
#q:LinkedList
<< create >>+Queue():Queue
+first():Object
+append(o:Object):void
+delete():void
+size():int
QueueSem
-nestingLevel:int
-pre$delete$size :int
-pre$append$size :int
-pre$append$first:Object
<< create >>+QueueSem (obj:IQueue ):QueueSem
-queue$init ():void
-pre$first():void
+first():Object
-post$first(first$result:Object):void
-pre$append(o:Object):void
+append(o:Object):void
-post$append(o:Object):void
-pre$delete():void
+delete():void
-post$delete():void
-pre$size():void
+size():int
-post$size(size$output:int):void
-queue$inv ():void
Created with Poseidon for UML Community Edition. Not for Commercial Use.
Í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
<< interface >>
IQueue
+first():Object
+append(o:Object):void
+delete():void
+size():int
- obj
Queue
#q:LinkedList
<< create >>+Queue():Queue
+first():Object
+append(o:Object):void
+delete():void
+size():int
QueueSem
-nestingLevel:int
-pre$delete$size :int
-pre$append$size :int
-pre$append$first:Object
<< create >>+QueueSem (obj:IQueue ):QueueSem
-queue$init ():void
-pre$first():void
+first():Object
-post$first(first$result:Object):void
-pre$append(o:Object):void
+append(o:Object):void
-post$append(o:Object):void
-pre$delete():void
+delete():void
-post$delete():void
-pre$size():void
+size():int
-post$size(size$output:int):void
-queue$inv ():void
Created with Poseidon for UML Community Edition. Not for Commercial Use.
Interfaz
IQueue.java
public interface IQueue {
Object first();
void append(Object o);
void delete();
int size();
}
Posible implementación
Queue.java
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);
}
...
Posible implementación
Queue.java
...
public void delete() {
q.removeFirst();
}
public int size() {
return q.size();
}
}
Í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 {
@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
}
...
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
}
}
Implementación
<< interface >>
IQueue
+first():Object
+append(o:Object):void
+delete():void
+size():int
- obj
Queue
#q:LinkedList
<< create >>+Queue():Queue
+first():Object
+append(o:Object):void
+delete():void
+size():int
QueueSem
-nestingLevel:int
-pre$delete$size :int
-pre$append$size :int
-pre$append$first:Object
<< create >>+QueueSem (obj:IQueue ):QueueSem
-queue$init ():void
-pre$first():void
+first():Object
-post$first(first$result:Object):void
-pre$append(o:Object):void
+append(o:Object):void
-post$append(o:Object):void
-pre$delete():void
+delete():void
-post$delete():void
-pre$size():void
+size():int
-post$size(size$output:int):void
-queue$inv ():void
Created with Poseidon for UML Community Edition. Not for Commercial Use.
Í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
<< interface >>
IQueue
+first():Object
+append(o:Object):void
+delete():void
+size():int
- obj
Queue
#q:LinkedList
<< create >>+Queue():Queue
+first():Object
+append(o:Object):void
+delete():void
+size():int
QueueSem
-nestingLevel:int
-pre$delete$size :int
-pre$append$size :int
-pre$append$first:Object
<< create >>+QueueSem (obj:IQueue ):QueueSem
-queue$init ():void
-pre$first():void
+first():Object
-post$first(first$result:Object):void
-pre$append(o:Object):void
+append(o:Object):void
-post$append(o:Object):void
-pre$delete():void
+delete():void
-post$delete():void
-pre$size():void
+size():int
-post$size(size$output:int):void
-queue$inv ():void
Created with Poseidon for UML Community Edition. Not for Commercial Use.
Llamada al método decorado
QueueSem.java
...
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();
}
}
...
llamada a la Pre/Post e invariante
QueueSem.java
...
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();
}
}
...
Semántica transaccional
QueueSem.java
...
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();
}
}
...
Evaluación del preestado
QueueSem.java
...
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();
}
}
...
Í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
public static void
assertTrue(String message, boolean condition)
 Evalua condition, si es falsa, lanza la
excepción AssertionFailedError con el
mensaje message
 Las condiciones se expresan en Java
Precondiciones
QueueSem.java
...
private void pre$append(Object o) {
Assert.assertTrue("@pre true", true);
}
...
Postcondiciones
QueueSem.java
...
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);
}
...
Invariantes
QueueSem.java
...
private void queue$inv(Object o) {
Assert.assertTrue("@inv true", true);
}
...
Condiciones iniciales
QueueSem.java
...
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();
}
...
Í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
TestsQueue.java
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();
}
...
}
!Gracias!
 ¿Podemos mejorar esta lección?
 Escríbenos al foro de la asignatura
 Visita la web de la asignatura