Qualitätssicherung mit automatischen Unit-Tests

Oktober 21, 2010 Benjamin Niediek

Niemand ist perfekt. Wo Menschen arbeiten, werden Fehler gemacht. Aufgabe der Qualitätssicherung ist es, Fehler frühzeitig zu erkennen und an die Entwicklung zurückzumelden, möglichst weit vor Freigabe des Projektes an den Kunden.

Die Qualitätssicherung ist  absolut unumgänglich und sollte immer fester Bestandteil einer jeden Projektzeitplanung sein. Methoden, die Qualität der von uns erstellten Websites, Online-Shops oder Social-Software sichern, gibt es viele – aber nur einige davon sind für uns wirklich relevant.

Ein wichtiger Teil der Qualitätssicherung hier bei HDNET sind automatisierte Tests. Was genau ist das? Gerade in der Programmierung gibt es immer wieder Problemfälle, die sehr identisch sind. Mal wird ein Formular nicht ausreichend auf eine valide E-Mail-Adresse geprüft, mal wird in einem Warenkorb ein Brutto- statt eines Nettopreises angezeigt. All diese kleineren und größeren Problemfälle lassen sich durch automatische Tests abdecken.

In einem dieser Tests definiert man einen sogenannten Testfall. Man legt fest, was getestet werden soll und was als Ergebnis dieses Tests erwartet wird. Beispielsweise könnte man sich innerhalb einer TYPO3-Extension eine Methode vorstellen, die 2 Zahlen addiert und das Ergebnis anschließend durch 2 dividiert. Ein idealer Kandidat für einen automatisierten Test. Wir wissen, dass wenn wir 4 und 6 addieren und anschließend durch 2 dividieren, als Ergebnis 5 herauskommen muss. Ein übereifriger Entwickler würde an die Umsetzung dieser Methode vielleicht etwas naiv und unüberlegt herangehen und in etwa so etwas implementieren:

public function berechne($operand1, $operand2) {
return $operand1 + $operand2 / 2;
}

Da der Entwickler in seine Fähigkeiten Vertrauen hat, belässt er es dabei und testet diese für ihn scheinbar kleine und einfache Aufgabe nicht.
Nun zu unserem automatischen Test. Wir wissen, dass als Ergebnis 5 herauskommen soll. Diese „Erwartung“ können wir nun in einem Test definieren:

public function testBerechnung() {
$berechnetesErgebnis = $entwickelteKlasse->berechne(4,6);
$this->assertEquals($berechnetesErgebnis, 5);
}

Nun wird sich der Eine oder Andere zu Recht fragen, wo sich hier das „automatisch“ versteckt – schließlich haben wir den Test ja manuell formuliert. Automatisch bedeutet, dass wir diesen Test zu jeder Zeit einfach ausführen können und so das Ergebnis kontrollieren. Die Ausführung der Tests kann auch über einen Server automatisch alle 5 Minuten ausgeführt werden, sodass sichergestellt ist, dass das Ergebnis dieses Tests immer stimmt.
Wird nun der Unit-Test ausgeführt, so bekommen wir eine Meldung, die uns ein wenig überrascht:

"Failed asserting that is equal to ."

Na so was. Hat sich der Entwickler tatsächlich bei einer so einfachen Methode vertan? Gut, dass wir den Test programmiert haben, der uns nun verrät, dass sich dort doch ein kleiner Fehler eingeschlichen hat. Der Entwickler bekommt als Testergebnis genau mitgeteilt, in welchem Teil der Anwendung ein Fehler ist (nämlich in der Methode „berechne()“) und kann diesen beheben. Er erinnert sich an seine Schulzeit und an die Regel „Punkt- vor Strichrechnung“, die natürlich auch in der Software Entwicklung gilt. Er korrigiert nun die fehlerhafte Berechnen-Methode:

public function berechne($operand1, $operand2) {
return ($operand1 + $operand2) / 2;
}

und startet nun erneut den Test, der nun meldet:

"1 test, 1 assertions, 0 failures, 0 skipped, 0 not implemented, 0 errors."

Natürlich wird pro Projekt nicht nur ein einziger Test angelegt, sondern in der Regel mehrere Hundert. Immer wenn Änderung oder Erweiterungen durchgeführt werden, können wir im Anschluss nochmals durch einen einfachen Klick die Tests automatisch ausführen lassen. Manuell würde diese Aufgabe viel Zeit verbrauchen und natürlich fehleranfälliger sein. Wie anfangs erwähnt, wo Menschen arbeiten, werden Fehler gemacht. Aus diesem Grund überlassen wir einen Teil der Qualitätssicherung unseren Rechnern.

Erst wenn alle Tests vollständig und ohne Fehler durchlaufen, ist der automatisierte Teil der Qualitätskontrolle abgeschlossen.

Share This: