it-swarm.com.de

Was nützt conftest.py in pytest?

Ich habe kürzlich pytest entdeckt. Es scheint großartig. Ich bin jedoch der Meinung, dass die Dokumentation besser sein könnte.

Ich versuche zu verstehen, wofür conftest.py - Dateien verwendet werden sollen.

In meiner (derzeit kleinen) Testsuite habe ich eine conftest.py - Datei im Projektstamm. Ich benutze es, um die Fixtures zu definieren, die ich in meine Tests einspeise.

Ich habe zwei Fragen:

  1. Ist dies die korrekte Verwendung von conftest.py? Hat es andere Verwendungszwecke?
  2. Kann ich mehr als eine conftest.py - Datei haben? Wann würde ich das machen wollen? Beispiele werden geschätzt.

Wie würden Sie allgemein den Zweck und die korrekte Verwendung von conftest.py - Dateien in einer py.test-Testsuite definieren?

152
Aviv Cohn

Ist dies die korrekte Verwendung von conftest.py?

Ja ist es. Fixtures sind eine potentielle und übliche Verwendung von conftest.py. Die von Ihnen definierten Fixtures werden für alle Tests in Ihrer Testsuite freigegeben. Das Definieren von Fixtures im Root-Verzeichnis conftest.py Kann jedoch unbrauchbar sein und das Testen verlangsamen, wenn solche Fixtures nicht von allen Tests verwendet werden.

Hat es andere Verwendungszwecke?

Ja tut es.

  • Fixtures : Definieren Sie Fixtures für statische Daten, die von Tests verwendet werden. Auf diese Daten kann von allen Tests in der Suite zugegriffen werden, sofern nicht anders angegeben. Dies können sowohl Daten als auch Helfer von Modulen sein, die an alle Tests weitergegeben werden.

  • Externes Laden von Plugins : conftest.py Wird verwendet, um externe Plugins oder Module zu importieren. Durch die Definition der folgenden globalen Variablen lädt pytest das Modul und stellt es für den Test zur Verfügung. Plugins sind in der Regel Dateien, die in Ihrem Projekt oder in anderen Modulen definiert sind und möglicherweise für Ihre Tests benötigt werden. Sie können auch eine Reihe vordefinierter Plugins laden, wie in hier erklärt.

    pytest_plugins = "someapp.someplugin"

  • Hooks : Sie können Hooks wie Setup- und Teardown-Methoden und vieles mehr angeben, um Ihre Tests zu verbessern. Lesen Sie hier für eine Reihe verfügbarer Hooks. Beispiel:

    def pytest_runtest_setup(item):
         """ called before ``pytest_runtest_call(item). """
         #do some stuff`
    
  • Root-Pfad testen : Dies ist eine versteckte Funktion. Wenn Sie in Ihrem Stammverzeichnis conftest.py Definieren, erkennt pytest Ihre Anwendungsmodule, ohne PYTHONPATH anzugeben. Im Hintergrund ändert py.test Ihren sys.path - Code, indem alle Submodule einbezogen werden, die im Root-Pfad gefunden werden.

Kann ich mehr als eine conftest.py-Datei haben?

Ja, das können Sie und es wird dringend empfohlen, wenn Ihre Teststruktur etwas komplex ist. conftest.py - Dateien haben einen Verzeichnisbereich. Daher ist es eine gute Praxis, gezielte Fixtures und Helfer zu erstellen.

Wann würde ich das wollen? Beispiele werden geschätzt.

Mehrere Fälle könnten passen:

Erstellen einer Reihe von Tools oder Hooks für eine bestimmte Gruppe von Tests.

root/mod/conftest.py

def pytest_runtest_setup(item):
    print("I am mod")
    #do some stuff


test root/mod2/test.py will NOT produce "I am mod"

Laden einer Reihe von Fixtures für einige Tests, aber nicht für andere.

root/mod/conftest.py

@pytest.fixture()
def fixture():
    return "some stuff"

root/mod2/conftest.py

@pytest.fixture()
def fixture():
    return "some other stuff"

root/mod2/test.py

def test(fixture):
    print(fixture)

Gibt "ein paar andere Sachen" aus.

Überschreiben von Hooks, die von der Wurzel conftest.py Geerbt wurden.

root/mod/conftest.py

def pytest_runtest_setup(item):
    print("I am mod")
    #do some stuff

root/conftest.py

def pytest_runtest_setup(item):
    print("I am root")
    #do some stuff

Wenn Sie einen Test in root/mod Ausführen, wird nur "Ich bin Mod" gedruckt.

Sie können mehr über conftest.pyhier lesen.

EDIT:

Was ist, wenn ich brauche, dass einfache Hilfsfunktionen aus einer Reihe von Tests in verschiedenen Modulen aufgerufen werden - stehen sie mir zur Verfügung, wenn ich sie in eine conftest.py stecke? Oder sollte ich sie einfach in ein helpers.py-Modul einfügen und in meine Testmodule importieren und dort verwenden?

Mit conftest.py Können Sie Ihre Helfer definieren. Sie sollten jedoch der gängigen Praxis folgen. Helfer können zumindest in pytest als Fixtures verwendet werden. Zum Beispiel habe ich in meinen Tests einen Schein-Redis-Helfer, den ich auf diese Weise in meine Tests injiziere.

root/helper/redis/redis.py

@pytest.fixture
def mock_redis():
    return MockRedis()

root/tests/stuff/conftest.py

pytest_plugin="helper.redis.redis"

root/tests/stuff/test.py

def test(mock_redis):
    print(mock_redis.get('stuff'))

Dies ist ein Testmodul, das Sie frei in Ihre Tests importieren können. [~ # ~] Beachten Sie [~ # ~] , dass Sie redis.py möglicherweise als conftest.py bezeichnen könnten, wenn Ihr Modul redis enthält weitere Tests. Von dieser Praxis wird jedoch aus Gründen der Mehrdeutigkeit abgeraten.

Wenn Sie conftest.py Verwenden möchten, können Sie diesen Helfer einfach in Ihr Stammverzeichnis conftest.py Einfügen und bei Bedarf einfügen.

root/tests/conftest.py

@pytest.fixture
def mock_redis():
    return MockRedis()

root/tests/stuff/test.py

def test(mock_redis):
    print(mock_redis.get(stuff))

Sie können auch ein installierbares Plugin schreiben. In diesem Fall kann Ihr Helfer überall geschrieben werden, muss jedoch einen Einstiegspunkt definieren, der in Ihrem und anderen potenziellen Test-Frameworks installiert werden soll. Siehe this .

Wenn Sie keine Fixtures verwenden möchten, können Sie natürlich einen einfachen Helfer definieren und den normalen alten Import verwenden, wo immer er benötigt wird.

root/tests/helper/redis.py

class MockRedis():
    # stuff

root/tests/stuff/test.py

from helper.redis import MockRedis

def test():
    print(MockRedis().get(stuff))

Hier können jedoch Probleme mit dem Pfad auftreten, da sich das Modul nicht in einem untergeordneten Ordner des Tests befindet. Sie sollten in der Lage sein, dies zu überwinden (nicht getestet), indem Sie Ihrem Helfer einen __init__.py Hinzufügen

root/tests/helper/__ init __. py

from .redis import MockRedis

Oder fügen Sie einfach das Hilfsmodul zu Ihrem PYTHONPATH hinzu.

204
Simone Zandara

Conftest.py ist im weitesten Sinne ein lokales Plugin für Verzeichnisse. Hier definieren Sie verzeichnisspezifische Hooks und Fixtures. In meinem Fall habe ich ein Stammverzeichnis mit projektspezifischen Testverzeichnissen. In der Datei 'root' conftest.py sind einige gebräuchliche Zaubersprüche enthalten. Projektspezifisch - in ihren eigenen. Kann nichts Schlechtes beim Speichern von Fixtures in conftest.py sehen, es sei denn, sie werden nicht häufig verwendet. (In diesem Fall bevorzuge ich es, sie direkt in Testdateien zu definieren.)

10
Furious Duck

Ich benutze die conftest.py - Datei, um die Fixtures zu definieren, die ich in meine Tests einspeise. Ist dies die richtige Verwendung von conftest.py?

Ja, ein Gerät wird normalerweise verwendet, um Daten für mehrere Tests vorzubereiten.

Hat es andere Verwendungszwecke?

Ja, ein Gerät ist eine Funktion, die von pytest vor und manchmal nach den eigentlichen Testfunktionen ausgeführt wird. Der Code in der Leuchte kann tun, was Sie wollen. Beispielsweise kann ein Fixture verwendet werden, um einen Datensatz für die Tests abzurufen, an denen gearbeitet werden soll, oder ein Fixture kann auch verwendet werden, um ein System in einen bekannten Zustand zu versetzen, bevor ein Test ausgeführt wird.

Kann ich mehr als eine conftest.py - Datei haben? Wann würde ich das wollen?

Erstens ist es möglich, Geräte in einzelne Testdateien zu packen. Um Fixtures für mehrere Testdateien freizugeben, müssen Sie jedoch eine conftest.py - Datei verwenden, die sich zentral für alle Tests befindet. Fixtures können von jedem Test geteilt werden. Sie können in einzelne Testdateien eingefügt werden, wenn das Gerät nur von Tests in dieser Datei verwendet werden soll.

Zweitens, yes, können Sie andere conftest.py - Dateien in Unterverzeichnissen des obersten Testverzeichnisses haben. In diesem Fall können Geräte, die in diesen untergeordneten conftest.py - Dateien definiert sind, in diesem Verzeichnis und in den Unterverzeichnissen getestet werden.

Wenn Sie Geräte in der Datei conftest.py Im Teststamm ablegen, stehen sie in allen Testdateien zur Verfügung.

6
lmiguelvargasf