Wie man xunit-style Setups implementiert¶
Dieser Abschnitt beschreibt eine klassische und beliebte Methode, um Fixtures (Testzustände einrichten und abräumen) pro Modul/Klasse/Funktion zu implementieren.
Hinweis
Obwohl diese Setup-/Teardown-Methoden einfach und für Personen, die mit unittest oder nose vertraut sind, bekannt sind, sollten Sie auch die leistungsfähigeren Fixture-Mechanismen von pytest in Betracht ziehen, die das Konzept der Dependency Injection nutzen und einen modulareren und skalierbareren Ansatz für die Verwaltung des Testzustands ermöglichen, insbesondere für größere Projekte und für funktionales Testen. Sie können beide Fixture-Mechanismen in derselben Datei mischen, aber Testmethoden von unittest.TestCase-Unterklassen können keine Fixture-Argumente empfangen.
Modul-Level Setup/Teardown¶
Wenn Sie mehrere Testfunktionen und Testklassen in einem einzigen Modul haben, können Sie optional die folgenden Fixture-Methoden implementieren, die normalerweise einmal für alle Funktionen aufgerufen werden.
def setup_module(module):
"""setup any state specific to the execution of the given module."""
def teardown_module(module):
"""teardown any state that was previously setup with a setup_module
method.
"""
Ab pytest-3.0 ist der Parameter module optional.
Klassen-Level Setup/Teardown¶
Ähnlich werden die folgenden Methoden auf Klassenebene aufgerufen, bevor und nachdem alle Testmethoden der Klasse aufgerufen wurden.
@classmethod
def setup_class(cls):
"""setup any state specific to the execution of the given class (which
usually contains tests).
"""
@classmethod
def teardown_class(cls):
"""teardown any state that was previously setup with a call to
setup_class.
"""
Methoden- und Funktions-Level Setup/Teardown¶
Ähnlich werden die folgenden Methoden bei jedem Aufruf einer Methode aufgerufen.
def setup_method(self, method):
"""setup any state tied to the execution of the given method in a
class. setup_method is invoked for every test method of a class.
"""
def teardown_method(self, method):
"""teardown any state that was previously setup with a setup_method
call.
"""
Ab pytest-3.0 ist der Parameter method optional.
Wenn Sie Testfunktionen lieber direkt auf Modulebene definieren möchten, können Sie auch die folgenden Funktionen verwenden, um Fixtures zu implementieren.
def setup_function(function):
"""setup any state tied to the execution of the given function.
Invoked for every test function in the module.
"""
def teardown_function(function):
"""teardown any state that was previously setup with a setup_function
call.
"""
Ab pytest-3.0 ist der Parameter function optional.
Anmerkungen
Es ist möglich, dass Setup-/Teardown-Paare mehrmals pro Testlauf aufgerufen werden.
Teardown-Funktionen werden nicht aufgerufen, wenn die entsprechende Setup-Funktion existierte und fehlgeschlagen ist oder übersprungen wurde.
Vor pytest-4.2 befolgten xunit-style Funktionen nicht die Scope-Regeln von Fixtures, daher war es zum Beispiel möglich, dass ein
setup_methodvor einem Session-Scope Autouse Fixture aufgerufen wurde.Jetzt sind die xunit-style Funktionen in den Fixture-Mechanismus integriert und befolgen die korrekten Scope-Regeln der beteiligten Fixtures.