Christian Binkhoff Zufallsbasiertes Testen mit QuickCheck

Werbung
Zufallsbasiertes Testen
mit QuickCheck
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Agenda
Einführung
Haskell
QuickCheck
Zusammenfassung
Zufallsbasiertes Testen mit QuickCheck
1
Christian Binkhoff
Einführung
Testen als essenzieller Bestandteil
gewährleistet Robustheit und Qualität von Software
Kosten in Höhe von 50% der Entwicklungskosten
 Forderung nach Effizienz von Testmethodiken
Zufallsbasiertes Testen als effiziente Methodik
Kein Starres Definieren von Testfällen
Generierung von Zufallsdaten für Input automatisch
Grundlage ist eine Verteilung
Überprüfung eines Moduls mit Zufallsdaten
vorwiegend Black-Box-Testing
Zufallsbasiertes Testen mit QuickCheck
2
Christian Binkhoff
Black-Box-Testing
Inputparameter
Code
Vergleich d. Outputs mit Soll
Implementierung bleibt verborgen
Lediglich Spezifikation der Funktionalität erforderlich
Paarweise Erzeugung von Input/Output-Daten
Vergleich von Soll- und erzeugtem Output
Erzeugung der Inputdaten willkürlich oder kalkuliert
 Prädestiniert für zufallsbasierte bzw. automatisierte Methodik
 Wahl der Verteilung relevant für Qualität eines Tests
 Relevanz von deklarativen Programmiersprachen
Zufallsbasiertes Testen mit QuickCheck
3
Christian Binkhoff
White-Box-Testing
Benutzung, falls Spezifikation schwierig
Code wird herangezogen
Control-Flow-Testing
Pfadabdeckung
Jeder Pfad mindestens 1-fach abgedeckt
Data-Flow-Testing
Bildung von Chains mit 3 Informationen (Var, Wert, Nutzung)
Ansätze zur Anwendung auch im deklarativen Umfeld
Zufallsbasiertes Testen mit QuickCheck
4
Christian Binkhoff
Agenda
Einführung
Haskell
QuickCheck
Zusammenfassung
Zufallsbasiertes Testen mit QuickCheck
5
Christian Binkhoff
Haskell
Haskell als deklarative Programmiersprache
Formulierung eines Problems durch Funktionen/Definitionen
Keine Explizite Konzeption
Haskell evaluiert Funktionen auf Grundlage eines Inputs
Zustandslos
Beispiel:
Zufallsbasiertes Testen mit QuickCheck
6
Christian Binkhoff
Haskell
Zufallsbasierter Kontext
Generierung verschiedener ‚n‘
Aufruf von ‚aufsummieren‘ mit jeweiligem ‚n‘
Vergleich des Ergebnisses mit Referenz/Spezifikation
Falls alle Durchläufe korrekt, ist ‚aufsummieren‘ „korrekt“
Zufallsbasiertes Testen mit QuickCheck
7
Christian Binkhoff
Haskell
Generierung von einfachen Typen trivial
Zustandlosigkeit von Haskell vorteilhaft (Seiteneffekte)
Zustandlosigkeit wirkt sich auf Generierung aus
Generierung von komplexen Datenstrukturen (Bäume)
nicht möglich
5
1
Abhilfe: Monaden
Zufallsbasiertes Testen mit QuickCheck
8
Christian Binkhoff
10
Monaden
Begriff der Mathematik
Umsetzung von imperativen Prinzipien (Zustand)
Ursprünglich für Input/Output von dekl. Programmen
Hilft bei der Generierung komplexer Datenstrukturen
Zufallsbasiertes Testen mit QuickCheck
9
Christian Binkhoff
Agenda
Einführung
Haskell
QuickCheck
Zusammenfassung
Zufallsbasiertes Testen mit QuickCheck
10
Christian Binkhoff
QuickCheck
In Haskell geschriebenes Modul
In Haskell als solches einsetzbar
Umfasst rund 300 Zeilen (lightweight)
 Testmethodik im Rahmen dekl. Programmiersprache
Black-Box-Testing
Zufallsbasiert auf Grund von Verteilungen
Zufallsbasiertes Testen mit QuickCheck
11
Christian Binkhoff
Konzept
Zufallsbasiertes Testen mit QuickCheck
12
Christian Binkhoff
Beispiel
Haskell-Interpreter:
Falsches Definition:
Zufallsbasiertes Testen mit QuickCheck
13
Christian Binkhoff
Komplexeres Problem
Zufallsbasiertes Testen mit QuickCheck
14
Christian Binkhoff
Funktionalität
Benutzung bedingter Properties möglich
Generierung erfolgt je Durchlauf solange, bis Property
erfüllt
Gefahr: Verzerrung der Verteilung
Restriktion der Bedingung verwirft bspw. bestimmte, notwendige
Testdaten
Beispiel: sortierte Liste als Bedingung  fast nur kurze Listen als
Input
Zufallsbasiertes Testen mit QuickCheck
15
Christian Binkhoff
Funktionalität
Überwachung von Inputparametern
Monitoring durch Klassifikation
„classify“
„collect“
Zufallsbasiertes Testen mit QuickCheck
16
Christian Binkhoff
Selbstdefinierte Generatoren




Hohe Qualität eines Tests gefordert
Annäherung der Testdaten an die tatsächlichen
Versuch der Anlehnung einer Verteilung
Berücksichtigung komplexer Typen
Forderung zur Konzeption eigener Generatoren
Beispiel Liste:
Generator für sortierte Listen
Bedingung entfällt
Listenlängen repräsentativ
Zufallsbasiertes Testen mit QuickCheck
17
Christian Binkhoff
Selbstdefinierte Generatoren
Eigener Typ instanziiert Klasse:
Eigener Generator muss spezifiziert werden
Standardtypen haben bereits Instanzen
Basisgeneratoren können kombiniert werden
Beispiel:
weitere: oneof, frequency, size
Abstraktes ‚Gen‘ ist Instanz der Haskell-Klasse „Monad“
 Berücksichtigung der Monadenfunktionalität
Zufallsbasiertes Testen mit QuickCheck
18
Christian Binkhoff
Binärbaum
mit Funktionen ‚suche‘ ‚loesche‘ und ‚einfuegen‘
Demo
Zufallsbasiertes Testen mit QuickCheck
19
Christian Binkhoff
Binärbaum
Der Aufruf erfolgt im Haskell-Interpreter
Die Properties werden getestet
In diesem Beispiel liegt der Anteil der Binärbaumgröße
von [1,2,3] bei etwa 20-30%
Zufallsbasiertes Testen mit QuickCheck
20
Christian Binkhoff
Agenda
Einführung
Haskell
QuickCheck
Zusammenfassung
Zufallsbasiertes Testen mit QuickCheck
21
Christian Binkhoff
Zusammenfassung
QuickCheck ist probates Mittel zum Testen
Schnell, effektiv, flexibel, einfach im Umgang
Überwachung der Testläufe
Geringe Testkosten
Nachteil
Keine Garantie bei postulierter Fehlerfreiheit
Konzeption komplexer Properties
Generatorenentwurf kann komplex werden
Ausblick
White-Box-Testing (Data-Flow) mit QuickCheck
White-Box-Testing bei Java
Zufallsbasiertes Testen mit QuickCheck
22
Christian Binkhoff
Ende
Vielen Dank für die Aufmerksamkeit!
Fragen?
Zufallsbasiertes Testen mit QuickCheck
23
Christian Binkhoff
Backup
Zufallsbasiertes Testen mit QuickCheck
24
Christian Binkhoff
Backup
Zufallsbasiertes Testen mit QuickCheck
25
Christian Binkhoff
Backup
Zufallsbasiertes Testen mit QuickCheck
26
Christian Binkhoff
Backup
Zufallsbasiertes Testen mit QuickCheck
27
Christian Binkhoff
Herunterladen