Veröffentlicht am

Unit Tests im Programmierkurs

testgetrieben-programmieren-lernen

Unit Tests im Programmierkurs – Test Driven Learning

“Hilfe – meine Lösung stimmt nicht mit der Beispiellösung überein!”
“Meine Lösung läuft zwar, aber ist sie auch korrekt?”

Programmieranfänger benötigen Aufgaben, viele Aufgaben. Und Beispiellösungen dazu. 

Doch ihre Unsicherheit bleibt: zu ein und derselben Aufgabe gibt es meistens mehrere korrekte Lösungen. Gehört die eigene Lösung dazu?

Autorin: Ursula Deriu

Unit Tests: das Zauberwort der Profis

Auch Profis kennen diese Herausforderung und zusätzlich wollen sie aus allen guten Möglichkeiten die beste wählen.

Anfängerinnen und Anfänger können noch gar nicht beurteilen, ob ihre Lösung überhaupt korrekt ist.

Software Engineers verlassen sich dazu gerne auf eine gute Testabdeckung ihres Codes. Sie sorgen also dafür, dass es genügend automatisierte Testfälle gibt, um sicherzustellen, dass auch nach einer Änderung die gesamte App korrekt läuft.
Code durch besseren Code ersetzen – das könnte ja eine solche Änderung sein.

Automatisierte Tests gehören zum modernen Software-Entwicklungszyklus. Und genau diese Philosophie dient auch den Anfängerinnen und Anfängern bei ihrer dringlichen Frage, ob ihre Lösung überhaupt korrekt ist:

Unit Tests: Sicherheit für Anfänger

Neben vielen Aufgaben und Beispiellösungen erhalten sie auch Testfälle, gegen die sie ihren Code testen.

Das folgende Bild zeigt ein Beispiel aus Sicht der Studierenden. Es ist eine sehr einfache Anfänger-Aufgabe in Python:

Training mit Testfällen
Beispiel einer einfachen testgetriebenen Python-Aufgabe für Anfänger mit Moodle 4 und Coderunner-Plugin.

Im Bereich oben steht die Aufgabenstellung und ein Beispiel eines möglichen Testfalls mit Input und erwartetem Ergebnis.

Die Lösung wird im Feld “Antwort” formuliert. Klickt man auf “Prüfen”, dann werden die automatisierten Tests ausgeführt. Der Code ist lauffähig und das Ergebnis steht unten im roten Bereich.

Offenbar sind in diesem Beipsile noch nicht alle Anforderungen aus der Aufgabenstellung erfüllt. Der Code wird korrigiert, bis das Ergebnis stimmt.

So erhalten die Studierenden die Sicherheit, dass sie auf dem richtigen Weg sind.

Unit Tests erstellen für Test Driven Learning

Die Art der Tests unterscheidet sich von den Testfällen bei produktiven Apps.

Es reicht meistens nicht, lediglich die Ausgabe zu testen – so wie im Beispiel oben.

Ein weiteres Beispiel:

Diese Aufgabenstellung gibt Code vor. Die for-Schleife soll als while-Schleife geschrieben werden. Eine wichtige Anfängerübung.

Beispiel Testfall
Typische Programmieraufgabe in einem Anfänger-Training. Diese Aufgabenstellung benötigt einen zielgerichteten Unit-Test.

Als Lösung wurde hier einfach der vorgegebene Code aus der Aufgabenstellung einkopiert.

Wenn die Testfälle jetzt nur den Output prüfen, dann wäre diese Lösung korrekt.

Doch die Aufgabe wurde gar nicht gelöst – die for-Schleife wurde nicht in eine while-Schleife umformuliert.

Verbesserter Test Case

Als Testfall könnten wir jetzt den Text im Antwortfeld nehmen und nach dem String ‘while’ suchen.

Kommt ‘while’ vor und stimmt der Output mit der Erwartung überein, dann ist die Aufgabe korrekt.

Aber: Die Lösung im Screenshot enthält den String ‘while’ jedoch steht er im Kommentar und nicht wie gefordert im Code selbst.
Die Test-Methode findet den String ‘while’, die Aufgabe wurde dennoch nicht gelöst.

Finalisierter Unit Test

In Python können wir mit ast-Modul den Code parsen. ast steht für Abstract Syntax Tree. Der Screenshot zeigt die Idee:

Der String, der die Lösung enthält, wird also geparst und anhand des Syntax-Trees können wir entscheiden, ob tatsächlich eine for-Schleife verwendet wurde.

Im Beispiel oben wird der Lösungsstring in Zeilen 5-8 aufbereitet.

Der Syntax-Tree wird lediglich mit pprint ausgegeben. Um robuste Test-Fälle zu schreiben, werden wir den Syntax-Tree mit ast.NodeVisitor untersuchen.

Schon bei der Ausgabe mit pprint sehen wir, dass der Kommentar im Syntax-Tree nicht auftaucht.

Wir suchen im Syntax-Tree nach einem Knoten für ‘while’ und finden diesen nicht. Demnach können wir zweifelsfrei feststellen, dass die Aufgabe nicht im Sinne der Aufgabenstellung gelöst wurde.

Fazit

Aufgabenstellungen für Test Driven Learning sind mit besonderer Sorgfalt zu entwickeln. Immerhin müssen wir dazu die passenden Testfälle schreiben und das ist ziemlich aufwändig.

Allerdings lohnt sich der Aufwand – denn der Anfänger erhält ein Instrument an die Hand, das diese dringende Frage beantwortet: “Stimmt meine Lösung”.

Spiel mit Python 1 ist nicht einfach noch ein Python Training. Vielmehr ist es eines der wenigen Python Trainings mit Testfällen und erst noch in deutscher Sprache.

Testgetrieben Python lernen für absolute Programmier-Anfänger

Python mit Testcases
Klick aufs Bild und erfahre mehr zum Anfänger Training mit vielen Unit-Tests