Python Test Nose: Nose ist ein Framework zur Testautomatisierung in Python, das auf der Standardbibliothek unittest basiert. Erfahre mehr über seine Vorteile, seine Funktionen, die Unterschiede zwischen den Versionen 1 und 2 und wie du eine Schulung absolvieren kannst, um es zu beherrschen!
Das unittest-Modul von Python wird für das Unit-Testing von Quellcode verwendet, insbesondere in den Bereichen Data Science und Machine Learning. Dieses Standard-Framework erfordert jedoch viel Code und zwingt dazu, die Tests in große Klassen einzubinden.
Als Alternative gibt es verschiedene Frameworks zur Testautomatisierung, wie z. B. PyUnit, Pytest, Robot oder Cucumber. Diese Tools vereinfachen die Arbeit der Entwickler am Testcode.
Das Automatisierungs-Framework Nose ist eine Erweiterung von Unittest, um das Testen zu vereinfachen. Hier erfährst du alles, was du wissen musst!
Was ist der Nose-Framework?
Nose ist ein Python-Framework zur Automatisierung von Tests, das 2005 von Jason Pellerin entwickelt wurde. Sein Ziel war es, die gleichen Testidiome wie py.test in einem Paket anzubieten, das einfacher zu installieren und zu verwenden ist.
Obwohl es auf unittest basiert, vereinfacht sein reichhaltiges Plugin-Ökosystem das Testen. Seine verschiedenen Plugins helfen bei der Testausführung, beim parallelen oder Multi-Prozess-Testing, beim Log-Management und bei der Berichterstattung.Es ermöglicht auch die Ausführung von Doctests, Unit-Tests oder Tests ohne „Boilerplate“-Code.
Darüber hinaus fügen Plug-ins die Unterstützung von Dekorateuren, Dekorationen, parametrisierten Tests, Klassen und Modulen hinzu. Ein weiterer Vorteil ist die Entdeckung von Testfällen und die automatische Sammlung.
Python Test Nose: Was ist Nose2 ?
Nose2 ist der Nachfolger von Nose, der auf dem Plugin-Zweig von unittest2 basiert. Es bietet eine bessere Plugin-API und vereinfacht die internen Prozesse und Schnittstellen.
Viele Plugins sind direkt in das Nose2-Modul eingebettet und werden standardmäßig geladen. Sie helfen u. a. bei der Parametrisierung von Tests, der Organisation von Testfixtures in Schichten, der Erfassung von Log-Meldungen und der Berichterstattung.
Die parallele Testausführung wird immer noch nicht unterstützt, aber das Laden von Plugins ist sehr einfach. Füge einfach Modulnamen zur Plugin-Liste im Abschnitt [unittest] der Konfigurationsdatei hinzu. Es ist auch möglich, das Plugin-Modul mit dem Argument -plugin auf der Befehlszeile zu übergeben.
Obwohl Nose2 als offizieller Nachfolger auf den Markt gebracht wurde, entscheiden sich viele Entwickler weiterhin für die Version 1.3.7. Daher werden beide Iterationen des Frameworks verwendet.
Python Test Nose: So funktioniert's
Die Testentdeckung mit Nose wird durch mehrere Regeln geregelt. Wie alle Python-Automatisierungsframeworks führt Nose automatisch alle Tests aus, die sich im übergeordneten Ordner und seinen Unterordnern befinden.
Die vom Framework ausgewählten Module oder Dateien müssen mit „‚test_'“ beginnen, ebenso wie die Methoden. Ebenso müssen Testklassen, die Methoden enthalten, mit „‚Test'“ beginnen.
Dies sind einige der Namenskonventionen, die für das Testen mit Nose verwendet werden. Die vollständigen Regeln sind auf der offiziellen Nose-Website zu finden.
Mit Nose2 implementiert ein Plugin die automatische Testentdeckung. Dieses Plugin sucht in Paketen und Verzeichnissen, deren Namen mit „test“ beginnen, nach Testmodulen oder -dateien und aktiviert den Hook loadTestsFromModule() für alle Entdeckungen. Dies ermöglicht es anderen Plugins, die Tests zu laden.
Definition und Funktionsweise von Fixtures
Das Nose-Framework ermöglicht Fixtures für die setup- und teardown-Methoden auf Test-, Paket-, Klassen- oder Modulebene. Dadurch werden unnötige Initialisierungen vermieden, die die Leistung beeinträchtigen können, wenn Tests häufig durchgeführt werden.
Wie bei den Fixtures py.test oder unittest wird die setup-Methode immer vor einem Test oder einer Sammlung von Tests ausgeführt. Die teardown-Methode wird gestartet, wenn die setup-Methode erfolgreich ausgeführt wurde.
Der Status des aktuellen Tests wird dabei nicht berücksichtigt. Somit erweitert Nose das Fixture-Modell von unittest für setup und teardown.
Fixtures können auf mehreren Ebenen durchgeführt werden. Zunächst werden bei Paketen, die mehrere Tests zusammenfassen, die setup- und teardown-Methoden einmal pro Testlauf gestartet. Dadurch wird vermieden, dass setup- und teardown-Methoden erstellt werden, die einmal pro Modul oder Testfall gestartet werden.
Es ist auch möglich, die setup- und teardown-Methoden auf Modulebene zu definieren. Die entsprechenden Methoden werden dann am Anfang und am Ende des Moduls ausgeführt.
Fixtures können setup und teardown auch auf Funktionsebene definieren. Wie ihre Namen schon sagen, werden die setup_function und teardown_function vor und nach einem Testfunktionsaufruf ausgeführt.
Es gibt keine spezielle Namenskonvention, aber es ist obligatorisch, die setup-Methode mit dem aus Nose importierten @with_setup-Dekorator anzuwenden.
Schließlich ist eine Testklasse eine Klasse, die in einem Testmodul definiert ist, das test_Match entspricht oder eine Unterklasse von unittest.TestCase ist. Die jeweiligen setup- und teardown-Funktionen werden am Anfang und am Ende der Testmethodenklasse ausgeführt. Die setup-Methode muss mit dem Dekorator @classmethod angewendet werden.
Python Test Nose: Parametrisiertes Testen
Die Version 1.3.7 des Nose-Frameworks bietet keine direkte Unterstützung für parametrisiertes Testen. Dazu muss das Paket „parameterized“ verwendet werden, das früher „nose-parameterized“ hieß.
Dieses Paket ist mit allen anderen Frameworks zur Testautomatisierung in Python kompatibel. Es wird installiert, indem du den Befehl „pip install parameterized“ im Terminal eingibst.
Nose2 seinerseits erfordert nicht die Installation eines separaten Pakets für die Parametrisierung von Tests. Es werden mehr Arten von parametrisierten Tests unterstützt. Testgeneratoren werden auch von den Testklassen, Testfunktionen und TestCase-Unterklassen von unittest unterstützt.
Python Test Nose: Paralleles Testen
Wie andere beliebte Test-Frameworks unterstützt auch Nose paralleles Testen. Das Plugin nose.plugins.multiprocess kann verwendet werden, um den Testlauf auf eine konfigurierbare Anzahl von Prozessen zu parallelisieren.
Dieser Ansatz beschleunigt CPU-gebundene Testläufe, ist aber auch sehr vorteilhaft für IO-gebundene Tests, bei denen die meiste Zeit für das Warten auf die Ankunft von Daten aufgewendet wird. Die offizielle Website von Nose enthält alle wichtigen Informationen über paralleles Testen.
Das mp-Plugin, das in Nose2 Version 0.3 eingeführt wurde, ermöglicht die Verteilung von Tests auf mehrere Prozesse. Es ist jedoch wichtig zu überprüfen, ob seine Verwendung nicht zu Konflikten führt.
Nose vs. Nose2: Was sind die Unterschiede?
Nose und Nose2 weisen mehrere wichtige Unterschiede auf. Zunächst einmal ist Nose2 für die aktuellen Python-Versionen verfügbar, während die erste Nose nur bis zur Version 2.4 unterstützt wird.
Wie unittest2 unterstützt auch Nose2 nur Fixtures auf Modul- oder Klassenebene. Fixtures auf Paketebene werden nicht mehr unterstützt.
Außerdem benötigt Nose2 keinen benutzerdefinierten Importer, da die Testmodule mit __import__() importiert werden. Die Unterstützung für parametrisierte und generierte Tests wird auch auf die TestCase-Klassen, -Funktionen und -Unterklassen von unittest ausgeweitet.
Während Nose setuptools-Einstiegspunkte zum Laden von Plugins verwendet, lädt Nose2 keine Plugins auf das Testsystem und zwingt dazu, die Plugins in den Konfigurationsdateien aufzulisten.
Schließlich müssen alle Konfigurationen über Konfigurationsdateien auf Nose2 vorgenommen werden. Dies ist bei der ersten Version nicht der Fall, da die Konfigurationseinstellungen als Kommandozeilenoptionen verfügbar sein müssen. Daher ist es besser, Nose2 für wiederholte Run-Tests zu verwenden, da die Konfiguration in besser lesbaren .cfg-Konfigurationsdateien gespeichert wird.
Python Test Nose - Wie verwende ich es ?
Um das Nose-Framework zu installieren, führe einfach den Befehl „pip install nose“ im Terminal aus. Das Nose-Paket kann mit „import nose“ im Code importiert werden, aber dieser Schritt ist optional.
Wenn du bestimmte Module verwendest, müssen diese mit „import Nose.<module_name>“ im Code importiert werden. Da das Nose-Modul sowohl für die bestehende Python-Distribution als auch für nosetests.exe installiert wird, ist es möglich, die Tests mit den Befehlen „nosetests <file_name.py>“ oder „python -m nose <file_name.py>“ auszuführen.
Um Nose2 zu installieren, tippe den Befehl „pip install nose2“ ein. Das Nose2-Paket kann mit „import nose2“ in die Implementierung importiert werden, und ein bestimmtes Modul des Pakets kann mit „from nose2.<package_name> import <module_name>“ importiert werden. Der Befehl, um einen Test mit Nose2 auszuführen, lautet „nose2 –verbose <filename_without_.py>“.
Fazit: Nose vereinfacht die Testautomatisierung
Du kennst jetzt den Nose-Framework für das Testen. Diese Erweiterung von unittest vereinfacht das Testen, und ihr Hauptvorteil ist, dass sie die Notwendigkeit von Boilerplate-Code eliminiert. Seine verschiedenen Plugins fügen Unterstützung für Dekoratoren, Fixtures, parametrisiertes Testen und vieles mehr hinzu.
Um zu lernen, wie man Python, seine Frameworks und Bibliotheken für Data Science und Machine Learning verwendet, bist Du genau richtig bei DataScientest.
Unsere verschiedenen Kurse beinhalten ein Modul, das dieser Programmiersprache gewidmet ist.
In diesen Kursen kannst du alle Fähigkeiten erwerben, die du als Data Analyst, Data Scientist, Data Engineer, Machine Learning Engineer oder Data Product Manager benötigst.
Alle unsere Programme können als BootCamp oder Weiterbildung absolviert werden, und unsere Organisation ist für den Bildungsgutschein zugelassen. Entdecke DataScientest!