Unittesting kurz erklärt
Hinweis: Unittest wurden in einigen Modulen zuvor bereits behandelt. zBsp Modul 320, Modul 426
- Ich kann den Zweck und die Bedeutung von Unit Tests im Softwareentwicklungsprozess erklären.
- Ich kann die Merkmale eines guten Unit Tests beschreiben.
- Ich kann Unit Tests mit JUnit in Java erstellen und ausführen.
- Ich kann Testfälle für Unit Tests entwerfen und implementieren.
- Ich kann Testabdeckungsmetriken (z.B. Anweisungs-, Zweig- und Bedingungsabdeckung) erklären und anwenden.
- Ich kann Testergebnisse interpretieren und Korrekturmassnahmen vorschlagen.
Die folgenden Abschnitte sind eine kurze Zusammenfassung zu den Lernziele. Sie sind nicht vollständig und nicht detailliert. Sie sollen nur einen Überblick geben.
Was in den Modulen zuvor behandelt wurde, wird vorausgesetzt.
Zweck und Bedeutung
Unit Tests prüfen kleine, abgegrenzte Teile eines Programms, meist einzelne Methoden oder Klassen. Aber auch von Komponeten, Modulen, Teilsystem oder ganzen Systemen.
Sie helfen, Fehler früh zu erkennen und Änderungen am Code abzusichern.
Merkmale guter Unit Tests
Gute Unit Tests sind verständlich, schnell, unabhängig voneinander und bei gleichen Voraussetzungen wiederholbar. Jeder Test prüft ein klar beschriebenes Verhalten.
Ein Unit Tests testet nur eine Funktionalität und keine Abhängigkeiten. Abhängigkeiten werden durch Mocks ersetzt.
Unit Tests mit JUnit
In JUnit kennzeichnet @Test eine Testmethode. Assertions wie assertEquals(erwartet, tatsächlich) prüfen, ob das Ergebnis den Erwartungen entspricht. Die Tests können in der IDE oder mit einem Build-Werkzeug ausgeführt werden.
(Diese Erklärung ist sehr knapp. Hinter JUnit steckt noch viel mehr!)
Testfälle entwerfen
Testfälle werden zum einen aus den Anforderungen abgeleitet.
Aber auch aus dem Code oder dem Module oder dem Teilsystem oder dem ganzen System. Man kann auch Testfälle aus Funktionen der Software ableiten, die man im Code findet, durch Interfaces und ...
Für jeden Test legt man eine Eingabe und das erwartete Ergebnis fest.
Und man berücksichtigt systematisch typische Fälle, Grenzwerte und Fehlerfälle.
Testabdeckung
- Anweisungsabdeckung: Welche Anweisungen wurden ausgeführt?
- Zweigabdeckung: Welche Entscheidungswege wurden durchlaufen?
- Bedingungsabdeckung: Wurden einzelne Teilbedingungen sowohl als wahr als auch als falsch ausgewertet?
Eine hohe Testabdeckung allein beweist nicht, dass die Tests alle wichtigen Fehler erkennen.
Testergebnisse auswerten
Bei einem fehlgeschlagenen Test vergleicht man das erwartete mit dem tatsächlichen Ergebnis und untersucht die Fehlermeldung.
Man entscheidet, was nun zu tun ist. Korrigieren oder nicht. Falls korrgieren ... korrigiert man die Ursache im Programm oder im Test und führt die Tests erneut aus.