Es wird erwartet, dass jede Software nach Abschluss des Entwicklungsprozesses ordnungsgemäß getestet wird, um Fehler zu erkennen und zu beheben. Es gibt unzählige Möglichkeiten, das zu tun. Manuelles Testen ist der einfachste Weg, um zu überprüfen, ob eine Software so funktioniert, wie sie sollte. Obwohl es eine einfache Möglichkeit ist, es zu testen, ist es definitiv nicht die effizienteste. Es ist unpraktisch, fehleranfällig und aufgrund menschlicher Fehler nicht immer genau. Beim manuellen Testen muss jede Software immer wieder vom Entwickler getestet werden, was sehr mühsam und zeitaufwändig sein kann. Um Redundanzen zu vermeiden, können Unit-Tests verwendet werden, um den Prozess für uns zu automatisieren und die manuellen Tests effizienter zu gestalten.
Durch Komponententests können wir testen, ob der von uns geschriebene Code wie beabsichtigt funktioniert. Das Hauptaugenmerk liegt darauf, zu testen, ob eine einzelne Einheit (kleinstes Stück Code, das getestet werden kann) wie eine Methode oder Funktion isoliert gut funktioniert. Das tatsächliche Verhalten einer Einheit wird mit dem erwarteten Verhalten verglichen und basierend auf dem Ergebnis wird der Test entweder bestanden oder nicht bestanden. Es liegt an uns zu entscheiden, ob der Test für ein bestimmtes Ergebnis bestanden oder nicht bestanden werden soll. Jeder Test muss nur einmal geschrieben werden und kann unzählige Male ausgeführt werden, um zu überprüfen, ob die Software gut funktioniert und wie gut sie auf gültige oder ungültige Eingaben reagiert. Mit diesem Ansatz sind wir in der Lage, Fehler früher effizient zu erkennen und zu beheben, was letztendlich zu geringeren Kosten führt.
Wie schreibt man in Python einen Testfall?
Python verfügt über ein integriertes Unit-Testing-Framework namens unittest, das Tools zum Schreiben und Ausführen von Tests enthält. Damit der Testrunner unterscheiden kann, welche Methoden einen individuellen Test darstellen, müssen Testmethoden definiert werden, deren Namen mit den Buchstaben „Test“ beginnen.
Die folgenden Beispiele zeigen ein Diagramm oder eine Struktur einer neuen Testfallklasse namens Example, die von unittest.TestCase und in Python implementiertem Code erbt, der derselben Struktur folgt.
Das Diagramm zeigt, wie sich das Example bei der Ausführung verhält. Die Methoden setUpClass und tearDownClass sind als Klassenmethoden definiert, um nur einmal für die gesamte Klasse aufgerufen zu werden. Beide enthalten auszuführende Anweisungen, setUpClass führt die Anweisungen aus, bevor alle Tests ausgeführt werden, und tearDownClass führt sie danach aus.
Die nächste Methode, die nach setUpClass aufgerufen wird, ist die setUp Methode. Diese Methode läuft vor jeder Testmethode, in diesem Fall testA und testB. Die Methode tearDown() wird nach jeder Testmethode ausgeführt. Wie bei den vorherigen Klassenmethoden enthalten beide auch Anweisungen, die vor und nach jedem Test ausgeführt werden müssen.
Beide Testmethoden, testA und testB, werden der Reihe nach ausgeführt. Beide haben unterschiedliche Testfälle, die Zusicherungen verwenden, um das tatsächliche Verhalten der Einheit gegenüber dem erwarteten Verhalten zu validieren. Die Methode testA ruft die Methode assertEqual auf, um nach einem erwarteten Ergebnis oder Ausgang zu suchen. Die Methode testB ruft die Methoden assertTrue und assertFalse auf, um eine Bedingung zu verifizieren.
Am Ende, wenn alle Testmethoden erfolgreich ausgeführt wurden, wird die tearDown Methode noch einmal vor der tearDownClass ausgeführt, die einige abschließende Anweisungen ausführt.
Führen Sie den Code mit einem interaktiven Python-Interpreter aus
Das folgende Beispiel zeigt die Ausgabe der Example Klasse, wenn sie in VS Code ausgeführt wird. Die erste Ausgabe zeigt OK, was bedeutet, dass alle Tests erfolgreich bestanden wurden. Die Punkte bedeuten, dass ein Test erfolgreich bestanden wurde. Dank der print Methoden, die wir zuvor in allen Methoden verwendet haben, können wir auch die Reihenfolge sehen, in der die Methoden aufgerufen wurden.
|
Um zu zeigen, wie es aussehen würde, wenn der Test nicht bestanden wäre, haben wir einige kleine Änderungen an unserer Testmethode testA vorgenommen, um einen Fehler einzuführen. Die Ausgabe zeigt FAILED, was bedeutet, dass einige der Tests fehlgeschlagen sind. Oben in der Ausgabe können wir sehen, welcher Test fehlgeschlagen ist, und es ist testA. Aus der Ausgabe können wir auch sehen, dass zwei Tests ausgeführt wurden und ein Test zu einem Fehler führte.
|
Zusammenfassend lässt sich sagen, dass Unit-Tests bei richtiger Implementierung ein nützliches Werkzeug sind, um Fehler während der Entwicklung schnell aufzuspüren und zu beheben. Bestimmte Methoden sollten immer implementiert werden, damit die Automatisierung funktioniert. Alle Tests können dann ausgeführt werden, wann immer wir wollen. Durch häufiges Ausführen der Tests können wir Fehler oder Bugs erkennen und die Gesamtqualität unseres Codes verbessern. Damit geben uns Unit-Tests die Gewissheit, dass sich der Code, an dem wir arbeiten, so verhält, wie wir es wollen, und man kann mit Sicherheit sagen, dass es allein dafür die Mühe wert ist, ihn zu lernen.
© – Gravity Vector