Quickcheck – Spezifikationsbasiertes Testen von Haskellprogrammen Koen Claessen, John Hughes.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
der Universität Oldenburg
Klassen - Verkettete Liste -
Präsentation PS: Klasse File von Janko Lange, Thomas Lung, Dennis Förster, Martin Hiller, Björn Schöbel.
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
10.2 Wechselseitiger Ausschluss in Hardware
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Quickcheck – Spezifikationsbasiertes Testen von Haskellprogrammen Koen Claessen, John Hughes.
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Kapitel 5. Stacks und Queues
Synonyme: Stapel, Keller, LIFO-Liste usw.
Es sei SPEC = (, E) eine Spezifikation mit einer
Finale Semantik und beobachtbares Verhalten
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
Spec# Proseminar Assertions im SS 2007 Uni Paderborn Andreas Martens Betreuer: Dipl. Inform. Björn Metzler.
Gliederung Motivation / Grundlagen Sortierverfahren
Management großer Softwareprojekte Prof. Dr. Holger Schlingloff Humboldt-Universität zu Berlin, Institut für Informatik Fraunhofer Institut für Rechnerarchitektur.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Indirekte Adressierung
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Referenzen und Zeichenketten
WS Algorithmentheorie 13 - Kürzeste (billigste) Wege Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Agenda Einführung Haskell QuickCheck Zusammenfassung
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Datentyp  Zusammenfassung von Mengen von "Werten" mit auf
Eine (Gleichungs-)Spezifikation ist ein Paar SPEC = (, E),
Automatisches Testen und Bewerten von Java-Klassen
C++ Standardbibliothek
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Klassen und Schnittstellen Klasse: Definiert Zustandsraum ihrer Instanzen vollständig (Implementierung der Struktur, soweit Voraussetzung für die Methoden-
Kapitel 2: Datenstrukturen
Types and Programming Languages: Einführung Typen SWT Seminar WS 05/06
Grundkonzepte Java - Klassendefinition
Informatik 1 Übung 2.
Delphi II - OOP IFB Fortbildung
Proseminar an der TU München Martin Levihn
C# Einheitliches Typsystem
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Software-Technik: (fortgeschrittene) Klassendiagramme
Primär(x)f(x)a[x]new typeof sizeof checked unchecked Unär+-~!++x--x x++ x-- (T)x Multip./Divis.*/% Addition/Subtr.+- shift > kleiner/größer = is gleich/ungleich==!=
Variablenkonzept Klassisch, in Java Basistyp
REBOL. Was ist REBOL frei verfügbar plattformübergreifend highly reflective flexibel kompakt interpretiert.
Programmiersprachen Proseminar Grundlagen wissenschaftlichen Arbeitens
Vortrag: Visual Basic Neuerungen Autor : Dennis Hoyer
Kapitel 5: Von Datenstrukturen zu Abstrakten Datentypen
Datentypen Überblick Datentypen Einfache / fundamentale Datentypen
Programmiervorkurs WS 2014/15 Schleifen
Korrektheit von Programmen – Testen
XQuery 1.0 – Arbeitsweise Mögl. Eingaben Das wird berücksichtigt: Typen von XPath und XML Schema Namensräume, Module Ergebnis: XML-Instanz.
Berechenbarkeit Klaus Becker Berechenbarkeit.
Quelle: xkcd.com SQL Injections.
2 Datenabstraktion Geheimnisprinzip:
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/ Übungsaufgabe vom Logische Ausdrücke 1.true & false | true 2.(10>2)
Test 1 Test 2 Test 3. Test 4 Test 5 Test 6 Test 7 Test 8 Test 9.
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Anforderungen an die neue Datenstruktur
Test.
 Präsentation transkript:

Quickcheck – Spezifikationsbasiertes Testen von Haskellprogrammen Koen Claessen, John Hughes

Motivation Dijkstra: Testen kann nie das Fehlen von Fehlern zeigen, sondern lediglich vorhandene Fehler aufdecken. Quickcheck erlaubt systematisches Testen von Haskellprogrammen liefert keine Korrektheitsnachweise erhöht nur das Vertrauen in Programme

Quickcheck definiert eine formale Spezifikationssprache um zu testende Eigenschaften direkt im Source- Code auszudrücken definiert eine Testdaten-Generierungssprache um große Testmengen kompakt zu beschreiben umfasst ein Werkzeug um die spezifizierten Eigenschaften zu testen und eventuell entdeckte Fehler zu melden wird mit Hugs und GHC ausgeliefert

Einfache Beispiele Eigenschaften sind monomorphe Boolesche Funktionen. einfach: prop_PlusAssociative :: Int -> Int -> Int -> Bool prop_PlusAssociative x y z = (x+y)+z == x+(y+z) bedingt: prop_InsertOrdered :: Int -> [Int] -> Property prop_InsertOrdered x xs = ordered xs ==> ordered (insert x xs) allquantifiziert: prop_InsertOrdered2 :: Int -> Property prop_InsertOrdered2 x = forAll orderedLists $ \ xs -> ordered (insert x xs)

Fallstudie: Warteschlangen emptyQueue :: Queue a enqueue :: Queue a -> a -> Queue a dequeue :: Queue a -> Queue a firstQueue :: Queue a -> a isEmptyQueue :: Queue a -> Bool Gleichungsspezifikation: dequeue (enqueue emptyQueue x) = emptyQueue isEmptyQueue q = False -> dequeue (enqueue q x) = enqueue (dequeue q) x firstQueue (enqueue emptyQueue x) = x isEmptyQueue q = False -> firstQueue (enqueue q x) = firstQueue q isEmptyQueue emptyQueue = True isEmptyQueue (enqueue q x) = False

Testgeneratoren erzeugen Testdaten -> Monadentyp Gen a vordefiniert für die meisten Typen, modifizierbar/erweiterbar -> Typklasse Arbitrary class Arbitrary a where arbitrary :: Gen a eigene Testgeneratoren mit forAll nutzbar forAll :: Gen a -> (a -> Bool) -> Property Auswahlfunktionen choose :: Random a => (a,a) -> Gen a oneof :: [ Gen a] -> Gen a frequency:: [(Int, Gen a)] -> Gen a Größenkontrolle sized :: (Int -> Gen a) -> Gen a resize :: Int -> Gen a -> Gen a

Beispiel: Testgenerator orderedLists orderedLists = do x <- arbitrary listsFrom x where listsFrom x = oneof [return [], doy <- atLeast x liftM (x:) (listsFrom y) ] atLeast x= do diff <- arbitrary return (x + abs diff) alternative Definition von listsfrom: listsFrom x = frequency [(1, return []), (4, doy <- atLeast x liftM (x:) (listsFrom y))]

Beispiel: Testgenerator für Bäume data Tree = Leaf Int | Branch Tree Tree tree :: Gen Tree tree =oneof [liftM Leaf arbitrary, liftM2 Branch tree tree] Problem: Baumerzeugung muss nicht unbedingt terminieren. -> Größenkontrolle: tree = sized stree stree :: Int -> Gen Tree stree 0 = liftM Leaf arbitrary stree n |n>0 =oneof [liftM Leaf arbitrary, liftM2 Branch subt subt] where subt = stree (n `div` 2)

Testkontrolle Klassifikation von Testfällen: trivial :: Bool -> Property –> Property Beispiel: prop_InsertOrdered x xs = ordered xs => (trivial (length xs <= 2) $ ordered(insert x xs) classify :: Property -> String -> Property Beispiel: prop_InsertOrdered x xs = ordered xs => (classify (null xs) empty $ (classify (length xs == 1) unit $ ordered(insert x xs)

Fazit leichte Überprüfung von Spezifikationen und Implementierungen durch systematisches Testen kein Korrektheitsnachweis, aber viele Fehler oder Inkonsistenzen werden aufgedeckt flexibel durch Möglichkeit der Testgenerierung und -kontrolle