15. September 2017 / von Jan Baganz

Juhu -

Nie wieder

Tests

Schreiben

Testgenerierung mit Property-Based-Testing

Was ist PBT?

Testen gehört seit jeher zu den tendenziell eher unbeliebten Aufgaben eines Entwicklers. Ebenso findet sich in Testfällen oft sehr viel Redundanz , sodass das Schreiben von Tests oft als eine sehr stumpfsinnige Arbeit empfunden wird. Was tut man also gegen diese fade Monotonie?

Die Lösung: Keine Testfälle schreiben, sondern sie einfach generieren lassen.

Das klingt im erste Moment einfach zu schön, um wahr zu sein. Jedoch verfolgt Property-Based-Testing genau diesen Ansatz. Natürlich kann eine Testmethodik/ein Framework nicht die gesamte Arbeit des Testens übernehmen, allerdings kann es helfen diese stark zu vereinfachen bzw. interessanter zu gestalten. Dieser Artikel soll zeigen wie PBT funktioniert und welche Grenzen es besitzt. Die Ergebnisse sind im Rahmen einer halbjährigen Masterarbeit von Jan Baganz hier bei Accso entstanden.

Wie funktioniert das jetzt genau?

Wie im vorherigen Abschnitt schon angerissen, ist Property-Based-Testing eine Testmethodik die mit zufällig generierten Testdaten arbeitet und gegen (oft invariante) Eigenschaften validiert. Die Testdaten werden von einem Generator erstellt, der, abgesehen von den Standarddatentypen, vom Entwickler selbst erstellt werden muss. Zusätzlich werden Properties erstellt, die ein Systemverhalten beschreiben, welches getestet werden soll. Die Properties werden dann mit den generierten Testdaten „gefüttert“ und evaluiert ob diese gültig sind.

Da das bisher noch sehr abstrakt klingt, schauen wir uns PBT an einem kleinen Beispiel an:

Als minimales Beispiel soll eine Methode getestet werden, die zwei Zahlen als Parameter enthält und die Summe der beiden Zahlen zurückgeben soll.

Property-Based-Testing

Die folgenden Properties sind Beispiele wie diese Methode mit PBT getestet werden kann. 

  1. Summe (a, b) == Summe (b, a)
  2. Summe (a, 0) == a

Dabei wird in der ersten Property die Kommutativität-Eigenschaft der Methode abgetestet und in der zweiten Property das neutrale Element. Ein passender Generator kann die Properties nun beliebig oft mit verschiedenen Kombinationen von „a“ und „b“ aufrufen. Je öfter er dies tut desto mehr Testfälle erhält man und desto besser getestet ist die Summen-Funktion.

In der Übersichtsgrafik beinhaltet der Generator noch eine Komponente „Shrinker“. Shrinking ist ein Verfahren indem bei einem Fehlschlag das Testdaten-Objekt nach vordefinierten Regeln solange verkleinert wird, bis der Test wieder grün ist. Durch dieses Verfahren kann PBT im Fehlerfall dem Tester spezifischere Hinweise auf einen Fehler geben.

Kann man das gebrauchen? – ein Experiment

Die Frage die sich bei neuartigen Methoden oder auch Frameworks stellt, und die auch Gegenstand der Masterarbeit war, ist ob die Methodik überhaupt praktisch anwendbar ist. Zur Beantwortung dieser Fragestellung wurde im Rahmen der Masterarbeit bei Accso ein Laborexperiment mit zwölf Kolleginnen und Kollegen durchgeführt. Die Fähigkeiten der Teilnehmer reichten dabei vom Junior Software Engineer, bis zum Managing Consultant.

Mittels verschiedener Java-Programmieraufgaben wurden viele Aspekte von PBT beleuchtet wie beispielsweise das Erlernen der Methodik oder die Anwendbarkeit von PBT auf verschiedene Projekte.

Dazu wurden den Teilnehmern verschiedene kleinere Implementierungen gegeben, die sie mittels PBT und klassischen, beispielbasierten  Tests, testen sollten.

Property-Based-Testing Praktikum bei Accso

Die Qualität der Tests wurden dann in der Auswertung mittels Metriken wie z.B. Code-Coverage oder Mutation Coverage ausgewertet. Auch ein Wettrennen , wer zuerst den Fehler in einer bestimmten Implementierung findet,  war Teil des Experimentes. 

Herausgestellt hat sich dabei, dass PBT zwar recht schnell angewendet werden kann, jedoch das Finden von aussagekräftigen Properties bei Weitem keine einfache Angelegenheit ist. Eine andere Erkenntnis des Experimentes ist zusätzlich, dass eine Kombination von PBT mit beispielbasierten Tests eine sehr gute Testabdeckung bezüglich der genannten Metriken erzielt, was für einen gemeinsamen Einsatz beider Methoden spricht.

Also? Kann man das jetzt gebrauchen?

Die Antwort darauf kann natürlich nur sein „Es kommt darauf an“. Die Einstiegshürde ist dabei zunächst sehr gering. Sobald das Prinzip klargeworden ist, kann man sehr schnell loslegen und einfache Properties finden. Komplexer wird es jedoch bei aussagekräftigeren Properties, Generatoren von verschachtelten Fachobjekt-Strukturen sowie den Fragen: „Wann habe ich genug Properties?“ oder „Wie aussagekräftig sind meine Properties?“. Gerade deswegen sollte PBT nicht alleine, sondern immer in Kombination mit beispielbasierten Tests eingesetzt werden. Einfacher dagegen ist es bei funktionalen Anwendungen die ohne Zustand auskommen.

Nichtsdestotrotz ist PBT eine Methodik die auf jeden Fall eine Betrachtung wert ist. Zusätzlich zu dem Aspekt des Testens beschreibt man durch das Definieren von abstrakten Systemeigenschaften sein System auf eine andere Art und Weise und bekommt dadurch ein Feedback zu seinem Design.

Autor

Weitere Artikel

Das könnte Sie auch interessieren