280 likes | 605 Views
Zufallsbasiertes Testen mit QuickCheck. Agenda. Einführung Haskell QuickCheck Zusammenfassung. 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
E N D
Agenda • Einführung • Haskell • QuickCheck • Zusammenfassung
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
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
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
Agenda • Einführung • Haskell • QuickCheck • Zusammenfassung
Haskell • Haskell als deklarative Programmiersprache • Formulierung eines Problems durch Funktionen/Definitionen • Keine Explizite Konzeption • Haskell evaluiert Funktionen auf Grundlage eines Inputs • Zustandslos • Beispiel:
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“
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 1 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
Agenda • Einführung • Haskell • QuickCheck • Zusammenfassung
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
Beispiel • Haskell-Interpreter: • Falsches Definition:
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
Funktionalität • Überwachung von Inputparametern • Monitoring durch Klassifikation • „classify“ • „collect“
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
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
Binärbaum • mit Funktionen ‚suche‘ ‚loesche‘ und ‚einfuegen‘ Demo
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%
Agenda • Einführung • Haskell • QuickCheck • Zusammenfassung
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
Ende Vielen Dank für die Aufmerksamkeit! Fragen?