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_method vor 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.