02 Testing
Last updated
Was this helpful?
Last updated
Was this helpful?
Ein Softwaretest prüft und bewertet Software auf Erfüllung der für ihren Einsatz definierten Anforderungen und misst ihre Qualität. Die gewonnenen Erkenntnisse werden zur Erkennung und Behebung von Softwarefehlern genutzt. Tests während der Softwareentwicklung dienen dazu, die Software möglichst fehlerfrei in Betrieb zu nehmen.
Softwaretests geben dem Entwickler die Gewissheit, dass bestimmte Komponenten seines Projekts wie von ihm getestet funktionieren. Sie erbringen aber keinen allgemeinen Nachweis, dass keine Programmfehler vorhanden sind.
«Program testing can be used to show the presence of bugs, but never show their absence!» - Edsger W. Dijkstra
Angenommen der Code deines Online-Shops wird zu einem grossen Teil durch automatisierte Tests geprüft.
Ein spezifischer Testfall prüft, ob sich Kunden erfolgreich einloggen können.
Wenn du jetzt eines Tages den Code für dein Login komplett neu schreiben möchtest, kannst du dank den vorhandenen Tests jederzeit überprüfen, ob trotz deiner getätigen Änderungen das Login noch korrekt funktioniert.
Löschst du zum Beispiel versehentlich das Passwort-Eingabefeld, wird dein Test fehlschlagen und du weisst sofort, dass ein Problem existiert.
Angenommen du hast einen schwerwiegenden Bug in deinem Shop: Die Funktion, die für die Überprüfung des Kundenpasswortes zuständig ist, gibt fälschlicherweise für jedes eingegebene Passwort immer true
zurück. Die Funktion wird durch keinen Testfall überprüft.
Dieser Bug bleibt von deinem Testfall unbemerkt, da das Login grundsätzlich funktioniert.
Es gibt viele verschiedene Arten und Methoden des Testings. Die Definition und Namensgebung dieser Methoden ist nicht immer ganz einheitlich definiert und kann je nach Anwendungsbereich abweichen.
Grundsätzlich können folgende Testarten unterschieden werden:
Unittests dienen dem Testen einzelner abgrenzbarer Komponenten einer Software. Diese Komponenten werden dabei isoliert und unabhängig vom System in dem sie verwendet werden getestet.
Beispiel
Testen einer PHP-Funktion (die Funktion ist in diesem Fall eine Unit
).
Beim Integrationstest wird überprüft, ob die Zusammenarbeit voneinander abhängiger Komponenten (Units
) wie erwünscht funktioniert.
Beispiel
In einem Online-Shop wird nach einer getätigten Bestellung automatisch eine PDF-Rechnung generiert und per Mail versendet. Dafür nutzen wir zwei Komponenten/Units: Eine InvoiceGenerator
-Klasse und eine CustomerMailer
-Klasse.
Wir überprüfen mit diesem Integrationstest lediglich, ob wir der Email unsere Rechnung anhängen können. Wir testen also die Schnittstelle zwischen InvoiceGenerator
und CustomerMailer
.
Wir möchten nicht testen, ob die Email versendet werden kann. Wir testen auch nicht, ob die Rechnung korrekt generiert wird. Dies wäre ein Unittest.
Bei Systemtests wird überprüft, ob unser System im Ganzen funktioniert. Sie unterscheiden sich gegenüber den Integrationstests indem hier auch externe Systeme miteinbezogen werden. Dafür wird meistens eine Testumgebung mit Testdaten verwendet. Die Testumgebung sollte immer die Zielumgebung 1:1 simulieren (gleiche Software-Versionen, etc).
Beispiel
Unser Online-Shop verwendet für den Email-Versand der Rechnungen einen lokal installierten Mail-Server. Mit folgendem Test überprüfen wir, ob wir Emails aus unserem PHP-Script über diesen Server versenden können und unser System somit funktioniert.
Ein Abnahmetest ist das Testen der gelieferten Software durch den Kunden. Hierbei orientiert man sich nicht mehr am Code sondern nur noch am Verhalten der Software.
Dazu werden Test-Szenarien definiert, die die genaue Funktionsweise der Software beschreiben.
Für die Definition eines Test-Szenarios können verschiedene Methoden verwendet werden. Eine gängige Methode ist die Given - When - Then
Schreibweise.
Da in den meisten Testing Frameworks solche Given - When - Then
Szenarios automatisch in ausführbaren Code umgewandelt werden können, werden sie üblicherweise auf Englisch verfasst.
Im Deutschen gibt es keinen offiziellen Standard diese Schreibweise anzuwenden. Dennoch spricht nichts dagegen, die Szenarien sinngemäss auf Deutsch zu übersetzen:
Beim manuellen Testing werden die spezifischen Testfälle von einer Person in Handarbeit durchgeführt.
Wenn du deine Website in deinem Browser aufrufst, ist dies zum Beispiel ein manuell ausgeführter Systemtest.
Beim automatisierten Testing können mehrere definierte Testfälle automatisch ausgeführt werden. Dazu müssen die Testfälle im Normalfall als ausführbarer Code vorhanden sein.
Der Vorteil hierbei ist ganz klar die Zeitersparnis beim mehrfachen Ausführen der Tests. So können beispielsweise vor der Veröffentlichung eines neuen Software-Releases automatisch alle Tests ausgeführt werden. Schlägt einer der Tests fehl, wird der neue Release nicht veröffentlicht.
Der Nachteil gegenüber dem manuellen Testing ist, dass alle Tests, zusätzlich zur eigentlichen Software, ebenfalls programmiert werden müssen.
Testing Frameworks wie PHPUnit oder Codeception vereinfachen diese Arbeit bei der Entwicklung mit PHP.
Eine weit verbreitete Art der Entwicklung ist das so genannte «Test-Driven-Development». Dabei wird vor der Entwicklung eines neuen Features ein Test definiert, der dieses noch nicht existierende Feature überprüft und darum fehlschlägt.
Anschliessend wird das neue Feature entwickelt, damit der Test erfolgreich ausgeführt werden kann.
Mit dieser Methode kann theoretisch sichergestellt werden, dass keine Funktion existiert, die nicht durch mindestens einen Test überprüft wird.
Hier einige Wörter, die im Zusammenhang mit Testing verwendet werden:
Wort
Bedeutung
Test case
Testfall: Kann mehrere Tests enthalten. Ist unabhängig von anderen Testfällen.
Assertion
Aussage/Annahme: Dient dazu zu überprüfen, ob ein Test fehlschlägt. Dabei wir das Ergebnis aus einem Test mit einem erwarteten Ergebnis verglichen. Beispiel: assert(sum(1, 2) === 3)
Szenario
Wir besonders bei Akzeptanztests verwendet. Das Szenario definiert die Situation, in der die Software getestet werden soll.
Schreibe für dein Task-Listen-Projekt mindestens 6 Testfälle eines «Acceptance Test» auf.
Gib die Liste anschliessend einem Kameraden, welcher dein Tool nach den vorgegeben Tests überprüft.
Zum Schluss gebt ihr euch gegenseitig eine Rückmeldung über die Testresultate und die Verständlichkeit der Tests.
Das beliebteste Testing Framework für Unittests in PHP ist .
Integrationstests können in PHP mit einem Testing Framework wie umgesetzt werden.
Systemtests können in PHP mit einem Testing Framework wie umgesetzt werden.