Testen van Java code met JML



Vergelijkbare documenten
Datastructuren Werkcollege Intro

Noties Informatica. In java fungeren objecten als een model voor de elementen waarin een probleem kan worden opgesplitst

Kleine cursus PHP5. Auteur: Raymond Moesker

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!

Specialisatie RTES - Project FunnyScreens. Installatie en gebruik van JUnit

Plan van Aanpak Afstuderen

Zelftest Programmeren in Java

Correspondentie inzake overnemen of reproductie kunt u richten aan:

Voorbeeld. public class BankRekening {

Voorlopig onderzoeksplan Bachelorscriptie CleanDoc-

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

Die inputs worden op een gecontroleerde manier aangeboden door (test) stubs. De test driver zorgt voor de uiteindelijke uitvoering ervan.

Software Test Documentation

Programmeren: Visual Basic

Lessen Java: Reeks 3. David Blinder Jan G. Cornelis

Automatische Testen van Java Klassen

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Java. Basissyllabus. Egon Pas

Programmeertechnieken Week 7

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Stichting NIOC en de NIOC kennisbank

Hoofdstuk 9: Object Constraint language (OCL) Prof. Dr. Olga De Troyer. Constraints

Programmeren in Java 3

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

TENTAMEN Programmeren 1

SEN1 Software Engineering 1

Tentamen Imperatief Programmeren

Unit testen van EJB's. Koert Zeilstra - iprofs

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

Sjabloon testspecificatie. <<Organisatie>>

Teststrategien. Pieter van den Hombergh. 20 februari Fontys Hogeschool voor Techniek en Logistiek Software Engineering

Modulewijzer Tirdat01

Algoritme noteren? Algoritmen voor de computer worden vastgelegd met behulp van een programmeertaal.

Modelleren en Programmeren

Algoritme noteren? Algoritmen voor de computer worden vastgelegd met behulp van een programmeertaal.

INFITT01 - Internettechnologie WEEK 8

Inhoudstafel. UML (Unified Modeling Language)

Opdracht 7a. Applicatiebouw 2014/2015

1 Inleiding in Functioneel Programmeren

Teststrategien. Hebben we wel het juiste gebouwd? Pieter van den Hombergh. 20 februari 2014

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET

Software Test Documentation

Inhoudsopgave. 1 Inleiding Situering Probleem beschrijving Wat is OCL Motivatie Doelstellingen...

Spreekvaardigheidstraining met behulp van Automatische Spraak-Herkenning (ASH)

Test rapportage Waarom eigenlijk?

Introductie in C++ Jan van Rijn. September 2013

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

2 OBJECTGEORIËNTEERDE BASISBEGRIPPEN.

Om de libraries te kunnen gebruiken, moet de programmeur (een deel van) zijn programma in C/C++ schrijven.

Modelleren en Programmeren

Open Source Software. Bart van Dijk

Objectgericht programmeren 1.

Unit testen met Rhino mocks Twee handen op één buik

TestNet Voorjaarsevenement 2010 Jurian van de Laar 12 mei 2010

Modeleren. Modelleren. Together UML. Waarvan maken we een model? overzicht les 14 t/m 18. ControlCenter 6.2

Deel 1 : Gesloten Boek

Vereiste kennis. 1 Java-editor. 2 Het compileren van een programma

DOMjudge teamhandleiding

Labo 1 Programmeren II

Introductie en even voorstellen

ONDERZOEK NAAR DE ZOEKMACHINE VRIENDELIJKHEID VAN COMMERCIËLE,

Vorig jaar in 5v cluster, tot en met OO hoofdstukken, geen problemen. Nu in mengcluster, tot OO hoofdstukken, wel problemen bij 4h leerlingen

Software Test Plan. Yannick Verschueren

vbg.vbnet.beginner Foutafhandeling binnen Visual Basic.NET

Inhoudsopgave. Hoofdstuk 1: Ant...4

Inhoud Inhoud. Over dit boek 7. 1 Eclipse IDE (Integrated Development Environment) 9. 2 Functionele specificatie 13

Unit testen met Rhino Mocks

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

OBJECT SPAGHETTI : PATTERNS BIEDEN UITKOMST? Wat is het probleem nou eigenlijk? public class CoffeeDrinker { private CoffeeProducer mycoffeeproducer;

EmSE presentatie. Starten met de ATtiny2313: Een RGB powerled driver Kees Moerman, 13 juli 2010

Transcriptie:

Testen van Java code met JML Engelbert Hubbers Martijn Oostdijk Erik Poll University of Nijmegen Testen met JML p.1/23

Overzicht De specificatietaal JML voor Java Wat voorbeelden van JML specificaties Runtime assertion checking en testen met JML Andere JML tools voor statische analyse, programmaverificatie,... Testen met JML p.2/23

De specificatietaal JML Testen met JML p.3/23

JML (Java Modeling Language) Formele specificatietaal voor Java, waarmee je het gedrag van Java classes kunt beschrijven ontwerp/implementatie-beslissingen kunt documenteren door middel van asserties, voor bijv. precondities postcondities invarianten (zoals Design-By-Contract in Eiffel, maar expressiever) JML begonnen door Gary Leavens, maar uitgegroeid tot breder initiatief. Doel: JML te begrijpen voor iedere Java programmeur. Testen met JML p.4/23

JML (Java Modeling Language) Om JML begrijpelijk & bruikbaar te maken: JML gebruikt gewone Java syntax, uitgebreid met een paar keywords JML specs staan gewoon in de Java source file, als speciaal soort commentaar, na //@, of tussen /*@... @*/ Testen met JML p.5/23

JML voorbeeld: invarianten private int balance; final static int MAX_BALANCE; /*@ invariant 0 <= balance && @*/ balance < MAX_BALANCE; Invariant moet gelden ná de constructor-aanroep, en zowel vóór als ná elke methode-aanroep. Testen met JML p.6/23

JML voorbeeld: precondities //@ requires amount >= 0; public int debit(int amount) {... } Preconditie is een verplichting voor klanten van deze methode. Testen met JML p.7/23

JML voorbeeld: postcondities /*@ requires...; ensures balance == \old(balance)-amount; @*/ public int debit(int amount) {... } Postconditie is garantie aan klanten van deze methode. Een pre-/postconditie paar wordt wel een contract genoemd. Testen met JML p.8/23

JML voorbeeld: exceptions /*@ requires...; ensures...; signals (DebitException) amount > balance; @*/ public int debit(int amount) {... } exceptional postconditie specifeert wanneer een bepaalde exceptie gegooid kan worden. Testen met JML p.9/23

private Object[] obs; JML voorbeeld: assert... for (k=0; k<obs.length & obs[k]!=null; k++); /*@ assert... @*/ (\forall int i; 0 <= i && i < k; obs[i]!= null); assert specificeert eigenschap op een willekeurig punt in code. Zit inmiddels in Java 1.4, maar JML is expressiever (door bijv. \old of \forall). Testen met JML p.10/23

Voordelen van JML Betere documentatie van code, door het expliciet maken van aannames en ontwerpbeslissingen (met name als invarianten) in formele ipv. natuurlijke taal Een formele taal is preciezer, en maakt tool support mogelijk, bijvoorbeeld bij testen... Testen met JML p.11/23

Testen met JML Testen met JML p.12/23

Runtime assertion checking Speciale compiler [Gary Leavens & Yoonsik Cheon, Iowa] vertaalt JML annotaties naar runtime checks: tijdens executie worden alle asserties getest (dwz alle preen postcondities, invarianten, asserts,... ) schendingen van asserties resulteren in een runtime error Testen met JML p.13/23

Testen met JML Runtime assertion checking is handig tijdens het testen. De JML specs dienen dan als test oracle. JML specs geven eigenschappen die we kunnen testen. De testcode hiervoor krijgen we gratis. Deze testcode doet veel tests, op veel tijdstippen tijdens de executie, en geeft dus goede feedback. Testen met JML p.14/23

Voordelen van JML bij testen (1) Betere feedback bij testen, over de locatie en de reden van fouten. Bijv. na 10 seconden Invariant violated in line 20000 ipv. na 100 seconden NullPointerException in line 30000 Informatie over oorzaak ipv. symptomen van het probleem. Testen met JML p.15/23

Voordelen van JML bij testen (2) Ingewikkelde testcode wordt automatisch gegenereerd. Bijv. voor /*@ requires amount >= 0; @*/ ensures balance == \old(balance)-amount; signals (DebitException) amount > balance; public int debit(int amount) {... wordt de \old(balance) gelogd, de exception afgevangen en opnieuw gegooid, en eventuele invarianten worden getest. Testen met JML p.16/23

jmlunit JML kan gecombineerd worden met JUnit, een populair regressie-testing framework voor Java (www.junit.org) Enige invoer nodig voor testen: voor elke type een lijst met waarden/objecten van dat type Bijv., gegeven Purse[] purses = {new Purse(), new Purse(10)}; int[] ints = {-9, -1, 0, 1, 2, 10, 100, Integer.MAX_VALUE}; wordt de debit methode aangeroepen op alle purses met alle mogelijke int s, en worden alle schendingen van asserties (muv. de eerste preconditie!) gerapporteerd. Testen met JML p.17/23

Andere JML tools Testen met JML p.18/23

Statische analyse Ambitieuzer dan run-time testen: probeer (mogelijke) schendingen van asserties te detecteren bij compile-time. Voordelen kan éérder in de ontwikkel-cyclus; kan meer zekerheid bieden: analyse is niet afhankelijk van test-sets, maar beschouwt willekeurige inputs. Maar: in hoeverre is dit mogelijk? Testen met JML p.19/23

JML tools voor statische analyse static checking met ESC/Java [Compaq, Leino et al] automatische verificatie van eenvoudige JML annotaties Bijv, verificatie dat er nooit een IndexOutOfBounds- of NullPointerException kan optreden. Niet sound, niet volledig, maar vindt snel veel bugs. programmaverificatie met LOOP tool [Nijmegen] interactieve verificatie van willekeurig ingewikkelde JML annotaties mbv. stellingbewijzer Wel sound en volledig, maar vereist veel gebruikerinteractie Feasible voor JavaCard smartcard programma s. Testen met JML p.20/23

Andere JML tools Niet voor checken, maar voor lezen/schrijven van JML annotaties: jmldoc [David Cok, Kodak] Integreert javadoc en JML Daikon [Michael Ernst, MIT] Observeert executies en detecteert (waarschijnlijke) invarianten, pre- en postcondities, en produceert JML annotaties hiervoor. Handig voor legacy code, of om test coverage te bepalen. Testen met JML p.21/23

(Commerciële) tools voor runtime assertion checking: i-contract Jcontract en Jtest Gebruikte assertietalen minder expressief dan JML. Related Work Tools voor statische analyse: PREfix en PREfast voor C(++) code, gebruikt bij MicroSoft. Focus op memory management, buffer overflows, etc. Testen met JML p.22/23

Conclusies JML is een eenvoudig te leren, formele specificatietaal voor Java Bij gebruik van JML ga je in vroeg stadium al nadenken over testbaarheid van code Het gebruik van JML runtime assertion checking bij testen: beter testen voor minder werk Het kan nuttiger zijn te investeren in asserties dan in test-code: dit kan in eerder stadium, asserties zijn beter onderhoudbaar, en ook nuttig voor andere doeleinden (mn. documentatie) Voor meer informatie, en alle tools: www.jmlspecs.org Testen met JML p.23/23