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