Zufallsbasiertes Testen mit QuickCheck
description
Transcript of Zufallsbasiertes Testen mit QuickCheck
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Zufallsbasiertes Testen mit QuickCheck
2
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Agenda
Einführung
Haskell
QuickCheck
Zusammenfassung
3
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Einführung
Testen als essenzieller Bestandteilgewährleistet Robustheit und Qualität von Software
Kosten in Höhe von 50% der Entwicklungskosten Forderung nach Effizienz von Testmethodiken
Zufallsbasiertes Testen als effiziente MethodikKein 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
4
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Black-Box-Testing
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
CodeInputparameter Vergleich d. Outputs mit Soll
5
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
White-Box-Testing
Benutzung, falls Spezifikation schwierig
Code wird herangezogen
Control-Flow-TestingPfadabdeckung
Jeder Pfad mindestens 1-fach abgedeckt
Data-Flow-TestingBildung von Chains mit 3 Informationen (Var, Wert, Nutzung)
Ansätze zur Anwendung auch im deklarativen Umfeld
6
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Agenda
Einführung
Haskell
QuickCheck
Zusammenfassung
7
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Haskell
Haskell als deklarative ProgrammierspracheFormulierung eines Problems durch Funktionen/Definitionen
Keine Explizite Konzeption
Haskell evaluiert Funktionen auf Grundlage eines Inputs
Zustandslos
Beispiel:
8
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Haskell
Zufallsbasierter KontextGenerierung verschiedener ‚n‘
Aufruf von ‚aufsummieren‘ mit jeweiligem ‚n‘
Vergleich des Ergebnisses mit Referenz/Spezifikation
Falls alle Durchläufe korrekt, ist ‚aufsummieren‘ „korrekt“
9
Zufallsbasiertes Testen mit QuickCheck
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
Abhilfe: Monaden
5
101
10
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Monaden
Begriff der Mathematik
Umsetzung von imperativen Prinzipien (Zustand)
Ursprünglich für Input/Output von dekl. Programmen
Hilft bei der Generierung komplexer Datenstrukturen
11
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Agenda
Einführung
Haskell
QuickCheck
Zusammenfassung
12
Zufallsbasiertes Testen mit QuickCheck
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
13
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Konzept
14
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Beispiel
Haskell-Interpreter:
Falsches Definition:
15
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Komplexeres Problem
16
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Funktionalität
Benutzung bedingter Properties möglich
Generierung erfolgt je Durchlauf solange, bis Property erfüllt
Gefahr: Verzerrung der VerteilungRestriktion der Bedingung verwirft bspw. bestimmte, notwendige Testdaten
Beispiel: sortierte Liste als Bedingung fast nur kurze Listen als Input
17
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Funktionalität
Überwachung von Inputparametern
Monitoring durch Klassifikation
„classify“
„collect“
18
Zufallsbasiertes Testen mit QuickCheck
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
19
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Selbstdefinierte Generatoren
Eigener Typ instanziiert Klasse:
Eigener Generator muss spezifiziert werden
Standardtypen haben bereits Instanzen
Basisgeneratoren können kombiniert werdenBeispiel:
weitere: oneof, frequency, size
Abstraktes ‚Gen‘ ist Instanz der Haskell-Klasse „Monad“ Berücksichtigung der Monadenfunktionalität
20
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Binärbaum
mit Funktionen ‚suche‘ ‚loesche‘ und ‚einfuegen‘
Demo
21
Zufallsbasiertes Testen mit QuickCheck
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%
22
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Agenda
Einführung
Haskell
QuickCheck
Zusammenfassung
23
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Zusammenfassung
QuickCheck ist probates Mittel zum TestenSchnell, effektiv, flexibel, einfach im Umgang
Überwachung der Testläufe
Geringe Testkosten
NachteilKeine Garantie bei postulierter Fehlerfreiheit
Konzeption komplexer Properties
Generatorenentwurf kann komplex werden
AusblickWhite-Box-Testing (Data-Flow) mit QuickCheck
White-Box-Testing bei Java
24
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Ende
Vielen Dank für die Aufmerksamkeit!
Fragen?
25
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Backup
26
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Backup
27
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Backup
28
Zufallsbasiertes Testen mit QuickCheck
Christian Binkhoff
Backup