Python Unittest Discovery
Dieser Artikel wird uns etwas über den Komponententest beibringen und wie man ihn für einen bestimmten Codeabschnitt ausführt. Wir werden lernen, wie der Befehl discover
verwendet wird, um den Modulnamen automatisch zu erkennen und warum er in Python möglicherweise nicht funktioniert.
Verwenden Sie das unittest
-Modul, um das Testmodul mit Hilfe des discover
-Befehls in Python zu erkennen
Wir können die Software nicht berühren, riechen oder fühlen, um ihre Qualität festzustellen, aber wir können sie mit einem Testtool testen. Der Komponententest ist die Methode, die einen kleinen Teil Ihrer Anwendung instanziiert und ihr Verhalten unabhängig von anderen Teilen überprüft.
Mit anderen Worten, Sie nehmen einen kleinen Teil Ihres Codes und testen ihn separat in einer kleinen Funktion. Dieser Teil der Entwicklung wird oft übersprungen, was dazu führt, dass das Testen Ihrer Software durch den Kunden eine schlechte Benutzererfahrung ist.
Ein typischer Komponententest besteht aus drei Phasen: Arrange, Act und Assert.
Arrange schafft geeignete Bedingungen, damit der Komponententest ausgeführt oder ein Objekt instanziiert werden kann. Act gibt diesem Objekt einige Eingaben oder Daten, und Assert überprüft, ob die Ausgabedaten wie erwartet waren.
Lassen Sie uns eine neue Datei namens demo.py
erstellen und mit dem Schreiben eines Codes beginnen; Wir werden zwei Funktionen erstellen, die zwei Zahlen addieren und subtrahieren. Diese Funktionen können nur Ganzzahlen oder Gleitkommazahlen als Argument akzeptieren; Andernfalls wird ein TypeError ausgelöst.
def Add_TWO_NUM(a, b):
return a + b
def SUB_TWO_NUM(a, b):
return a - b
Jetzt erstellen wir eine test_functions.py
-Datei für den Test mit unittest
, weil unittest
in die Python-Distribution integriert ist. Wir müssen nichts tun, um es zu installieren; Wir können jedoch unittest
in unseren Code importieren.
Wir haben dieses zusätzliche Präfix hier, test_
, vor dem Namen unserer Datei, functions.py
, hinzugefügt. Dieses test_
-Präfix hilft unittest
zu erkennen, dass dies die Datei ist, in der die Unit-Testing-Funktionen geschrieben sind.
Wie Sie sehen, importieren wir zuerst das Modul unittest
und dann die Funktion aus den Modulen, die wir testen möchten, und dann initialisieren wir eine Klasse namens TesstSomeFunctions
. Wenn Sie eine Testklasse schreiben müssen, sollten Sie eine Testklasse schreiben, bevor Sie alle Testfunktionen schreiben.
Da wir testen, müssen wir in Klammern unittest.TestCase
angeben; die benutzerdefinierte Klasse sollte von unittest.TestCase
abgeleitet werden. Das Ausführen eines Tests ist die einzige Möglichkeit, Funktionen durch den unittest
aufzurufen; es handelt sich um Unit-Tests, und jede Funktion in dieser Klasse ist ein einzelner Unit-Test.
Wir können dies wie jede andere Funktion in unserem Python-Skript definieren und das Schlüsselwort def
schreiben. Beginnen Sie dann den Namen mit dem Testpräfix wie test_
und dann mit dem Namen, den wir ihm geben können.
Das Modul unittest
liefert uns Assertion. Mit unittest
können Sie alle Assets im Modul unittest
einsehen. oder alle Methoden auf der offiziellen Dokumentation.
Mit der assertEqual()
-Methode prüfen wir, ob diese Funktion 10 zurückgibt oder nicht. Assertion gibt an, dass Sie behaupten möchten, dass die Funktion das gewünschte Ergebnis zurückgibt, da wir das Ergebnis 10 erwarten.
Wir liefern 4 und 6 als Argument für diese Add_TWO_NUM()
-Funktion. Im zweiten Argument der Methode assertEqual()
stellen wir eine Überprüfung bereit, ob es gleich ist oder nicht.
Wir werden auch eine andere Funktion namens test_SUB_TWO_NUM()
testen, der Prozess wäre der gleiche, aber in dieser Funktion testen wir eine Funktion, die zwei Zahlen subtrahiert. Jetzt müssen wir in die Datei gehen und eine Zeile if __name__=='__main__'
schreiben und den Unit-Test mit dem Befehl unittest.main()
ausführen.
import unittest
from demo import Add_TWO_NUM, SUB_TWO_NUM
class TesstSomeFunctions(unittest.TestCase):
def test_Add_TWO_NUM(self):
self.assertEqual(Add_TWO_NUM(4, 6), 10)
def test_SUB_TWO_NUM(self):
self.assertEqual(SUB_TWO_NUM(5, 3), 2)
if __name__ == "__main__":
unittest.main()
Die beiden Testfälle sind jetzt fertig, also lassen Sie uns die Python-Datei ausführen. Wie Sie sehen können, gab es uns Informationen über die beiden Tests, die in 0,0 Sekunden ausgeführt wurden.
Diese beiden Punkte stellen die bestandenen Tests dar. Sie würden ein großes F
sehen, wenn der Test nicht bestanden wurde.
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
Was ist, wenn Sie Ihr Testmodul nicht aus der Datei als Modul ausführen möchten? Nun, Sie können das tun, indem Sie den Befehl im Terminal eingeben.
python -m unittest test_functions.py
Dieser Befehl funktioniert trotzdem.
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
Wenn Sie weitere Informationen wünschen, können Sie v -
eingeben, was ausführlich
bedeutet, wodurch Sie mehr Details zu jedem Komponententest erhalten. Er sagt Ihnen, welcher Test der beste ist.
python -m unittest -v test_functions.py
Ausgang:
test_Add_TWO_NUM (test_functions.TesstSomeFunctions) ... ok
test_SUB_TWO_NUM (test_functions.TesstSomeFunctions) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
Es gibt auch eine dritte Möglichkeit, den Unit-Test vom Terminal aus auszuführen, discover
. Dieser Befehl erkennt automatisch alle Module, die mit einem Test beginnen, sodass wir den Modulnamen nicht einzeln übergeben müssen.
Deshalb ist es wichtig, alle Ihre Module beginnend mit test
zu benennen.
python -m unittest discover
Ausgang:
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
Wenn der Name der Testdatei nicht mit test
beginnt, gibt der Befehl discover
nichts zurück, da er ihn als normale Python-Datei oder -Modul erkennt. Weitere Informationen zum unittest
-Modul finden Sie unter python.org.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn