Eine Übersetzung des Artikels wurde speziell für Studenten des Python QA Engineer- Kurses erstellt.
Unit-Code-Tests sind ein wesentlicher Bestandteil des Software-Entwicklungszyklus. Unit-Tests bilden auch die Grundlage für die Durchführung von Regressionstests, das heißt, sie stellen sicher, dass sich das System gemäß dem Szenario verhält, wenn neue Features hinzugefügt oder vorhandene geändert werden.
In diesem Artikel werde ich die Grundidee des Komponententests in einer Klasse demonstrieren. In der Praxis müssen Sie viele Testfälle schreiben, der Testsuite hinzufügen und alle zusammen ausführen. Die Verwaltung von Testfällen wird im nächsten Artikel behandelt.
Heute werden wir uns auf das Testen des Backends konzentrieren. Das heißt, der Entwickler hat ein Projekt gemäß den Spezifikationen implementiert (z. B. Calculator.py), und Sie müssen sicherstellen, dass der entwickelte Code wirklich mit ihnen übereinstimmt (z. B. mit
TestCalculator.py
).
Angenommen, Sie haben die Calculator-Klasse geschrieben, um grundlegende Rechenfunktionen auszuführen: Addition, Subtraktion, Multiplikation und Division.
Der Code dafür ist hier (
Calculator.py
):
Jetzt möchte ich einen Komponententest durchführen, um zu verstehen, dass die Funktionalität in der obigen Klasse wie geplant funktioniert.
Python wird normalerweise mit dem
unittest
Paket
unittest
. Wenn es nicht auf Ihrem System vorhanden ist, installieren Sie es mit pip.
Der Komponententest hat folgenden Aufbau:

setUp()
und
tearDown()
sind Standardmethoden, die mit dem unittest-Framework
tearDown()
werden (sie sind in der unittest.TestCase-Klasse definiert). Abhängig von Ihrem Testfall können Sie diese beiden Methoden standardmäßig außer Kraft setzen oder nicht.
Es ist Zeit, sich den Code des Testfalls anzusehen. Hier ist die Datei
TestCalculator.py
.
import unittest from Calculator import Calculator
Das ist zwar nicht nötig, aber in der Regel rufe ich die Testklasse mit dem Präfix Test (in unserem Fall TestCalculator) auf. Eine Schlüsselanforderung in dieser Klasse ist das Vorhandensein der Superklasse
unittest.TestCase
.
Immer wenn dieser Testfall ausgeführt wird, wird zuerst die Methode setUp () ausgeführt. In unserem Fall erstellen wir einfach ein Objekt der Klasse Calculator und speichern es als Attribut der Klasse. In der übergeordneten Klasse gibt es mehrere andere Standardmethoden, die wir später erläutern werden.
Im
test_xxx
müssen Sie nur
test_xxx
Methoden schreiben, um jede Methode in der Calculator-Klasse zu testen. Bitte beachten Sie, dass alle Testmethoden mit dem Präfix
test_
. Dies teilt Python unter Verwendung des unittest-Frameworks mit, dass dies Testmethoden sind.
Bei jeder Testmethode habe ich die integrierte
assertEqual
Methode verwendet, um zu überprüfen, ob die
assertEqual
den erwarteten Wert zurückgeben. Wenn der Rückgabewert dem erwarteten Wert entspricht, ist der Test erfolgreich, andernfalls schlägt er fehl.
Es gibt viele integrierte
assert
Methoden, über die wir später sprechen werden.
Die letzte Zeile im obigen Code startet nur den
TestCalculator
. Es führt jede in der Klasse definierte Testmethode aus und gibt das Ergebnis zurück.
python TestCalculator.py -v
Sie werden eine Schlussfolgerung ähnlich der folgenden sehen:
test_add (__main__.TestCalculator) ... ok test_divide (__main__.TestCalculator) ... ok test_multiply (__main__.TestCalculator) ... ok test_subtract (__main__.TestCalculator) ... ok -------------------------------------------------------------------- Ran 4 tests in 0.000s OK
Was ist, wenn etwas nicht wie erwartet funktioniert? Ändern wir den erwarteten Wert von
test_divide
von 5 auf 6 (5 ist der richtige Wert. Nun werden wir sehen, was passiert, wenn es fehlschlägt. Dies ist kein Fehler im Quellcode, sondern ein Fehler in der Testsuite. Möglicherweise haben Sie auch Fehler in den Testsuiten Testskripte auf Fehler prüfen!)
import unittest from Calculator import Calculator
Wenn Sie diesen Testfall ausführen, erhalten Sie das folgende Ergebnis:
test_add (__main__.TestCalculator) ... ok test_divide (__main__.TestCalculator) ... FAIL test_multiply (__main__.TestCalculator) ... ok test_subtract (__main__.TestCalculator) ... ok ==================================================================== FAIL: test_divide (__main__.TestCalculator) -------------------------------------------------------------------- Traceback (most recent call last): File "TestCalculator.py", line 23, in test_divide self.assertEqual(self.calculator.divide(10,2), 6) AssertionError: 5.0 != 6 -------------------------------------------------------------------- Ran 4 tests in 0.001s FAILED (failures=1)
Hier steht, dass 3 von 4 Tests erfolgreich waren, einer jedoch fehlgeschlagen ist. In einem realen Szenario wird davon ausgegangen, dass Ihr Testfall korrekt ist. Auf diese Weise können Sie eine Funktion identifizieren, die nicht ordnungsgemäß implementiert ist.