Ich habe vor kurzem entdeckt pytest
. 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 injiziere.
Ich habe zwei Fragen:
- Ist das die richtige Verwendung von
conftest.py
? Hat es andere Verwendungszwecke? - 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?
It seems great. However, I feel the documentation could be better.
conftest.py
und obwohl es viele Verweise darauf gibt, dieses oder jenes Ding mit einer Conftest-Datei zu machen, gibt es nirgends in der Dokumentation jemals einen Hinweis darauf, dass beim Testen von pytest alle conftest.py-Dateien gefunden wurden (innerhalb der Die Verzeichnisstruktur, über die die Testerkennung durchgeführt wird, wird während der Testsammlungsphase ausgeführt (bevor Tests ausgeführt werden). Musste das selbst durch Experimentieren herausfinden.Antworten:
Ja, so ist es. Vorrichtungen sind eine mögliche und übliche Verwendung von
conftest.py
. Die von Ihnen definierten Geräte werden von allen Tests in Ihrer Testsuite gemeinsam genutzt. Das Definieren von Fixtures in der Wurzelconftest.py
kann jedoch nutzlos sein und das Testen verlangsamen, wenn solche Fixtures nicht von allen Tests verwendet werden.Ja tut es.
Befestigungen : Definieren Vorrichtungen für statische Daten von Tests verwendet. Auf diese Daten können alle Tests in der Suite zugreifen, sofern nicht anders angegeben. Dies können sowohl Daten als auch Helfer von Modulen sein, die an alle Tests übergeben werden.
Externes Laden von Plugins :
conftest.py
Dient zum Importieren externer Plugins oder Module. Durch Definieren der folgenden globalen Variablen lädt pytest das Modul und stellt es für seinen Test zur Verfügung. Plugins sind im Allgemeinen Dateien, die in Ihrem Projekt oder anderen Modulen definiert sind und möglicherweise in Ihren Tests benötigt werden. Sie können auch eine Reihe vordefinierter Plugins laden, wie hier erläutert .pytest_plugins = "someapp.someplugin"
Hooks : Sie können Hooks wie Setup- und Teardown-Methoden und vieles mehr angeben, um Ihre Tests zu verbessern. Eine Reihe verfügbarer Haken finden Sie hier . Beispiel:
Root-Pfad testen : Dies ist eine versteckte Funktion. Wenn Sie
conftest.py
in Ihrem Stammpfad definieren ,pytest
erkennen Sie Ihre Anwendungsmodule ohne AngabePYTHONPATH
. Im Hintergrund ändert py.test Ihre,sys.path
indem alle Submodule eingeschlossen werden , die im Stammpfad gefunden werden.Ja, das können Sie und es wird dringend empfohlen, wenn Ihre Teststruktur etwas komplex ist.
conftest.py
Dateien haben Verzeichnisbereich. Daher ist es eine gute Praxis, gezielte Geräte und Helfer zu erstellen.Mehrere Fälle könnten passen:
Erstellen einer Reihe von Tools oder Hooks für eine bestimmte Gruppe von Tests.
root / mod / conftest.py
Laden einer Reihe von Vorrichtungen für einige Tests, für andere jedoch nicht.
root / mod / conftest.py
root / mod2 / conftest.py
root / mod2 / test.py.
Druckt "einige andere Sachen".
Überschreiben von Hooks, die von der Wurzel geerbt wurden
conftest.py
.root / mod / conftest.py
root / conftest.py
Wenn Sie einen Test ausführen
root/mod
, wird nur "I am mod" gedruckt.Sie können mehr über lesen
conftest.py
hier .BEARBEITEN:
Sie können verwenden
conftest.py
, um Ihre Helfer zu definieren. Sie sollten jedoch die gängige Praxis befolgen. Helfer können zumindest in als Vorrichtungen verwendet werdenpytest
. Zum Beispiel habe ich in meinen Tests einen nachgebildeten Redis-Helfer, den ich auf diese Weise in meine Tests einspritze.root / helper / redis / redis.py
root / tests / stuff / conftest.py
root / tests / stuff / test.py.
Dies ist ein Testmodul, das Sie frei in Ihre Tests importieren können. HINWEIS, dass Sie möglicherweise so benennen könnten,
redis.py
alsconftest.py
ob Ihr Modulredis
mehr Tests enthält. Von dieser Praxis wird jedoch aufgrund von Mehrdeutigkeiten abgeraten.Wenn Sie verwenden möchten
conftest.py
, können Sie diesen Helfer einfach in Ihre Wurzelconftest.py
einfügen und ihn bei Bedarf injizieren.root / tests / conftest.py
root / tests / stuff / test.py.
Sie können auch ein installierbares Plugin schreiben. In diesem Fall kann Ihr Helfer überall geschrieben werden, er muss jedoch einen Einstiegspunkt definieren, der in Ihrem und anderen potenziellen Testframeworks installiert werden soll. Sehen Sie das .
Wenn Sie keine Fixtures verwenden möchten, können Sie natürlich einen einfachen Helfer definieren und einfach den alten Import verwenden, wo immer er benötigt wird.
root / tests / helper / redis.py
root / tests / stuff / test.py.
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
__init__.py
Ihrem Helfer ein hinzufügenroot / tests / helper / __ init__.py
Oder fügen Sie einfach das Hilfsmodul zu Ihrem hinzu
PYTHONPATH
.quelle
test_aaaaa.py
tatsächlich versucht, ausgeführt zu werden, bevor das Setup des Geräts abgeschlossen istconftest.py
. Irgendwelche Gedanken darüber, warum dies auftreten kann?Im weitesten Sinne ist conftest.py ein lokales Plugin pro Verzeichnis. Hier definieren Sie verzeichnisspezifische Hooks und Fixtures. In meinem Fall haben Sie ein Stammverzeichnis mit projektspezifischen Testverzeichnissen. Einige gängige Magie ist in 'root' conftest.py stationiert. Projektspezifisch - in ihren eigenen. Ich kann beim Speichern von Fixtures in conftest.py nichts Schlechtes sehen, es sei denn, sie werden nicht häufig verwendet (in diesem Fall definiere ich sie lieber direkt in Testdateien).
quelle
Ja , ein Gerät wird normalerweise verwendet, um Daten für mehrere Tests vorzubereiten.
Ja , ein Gerät ist eine Funktion, die
pytest
vor und manchmal nach den eigentlichen Testfunktionen ausgeführt wird. Der Code im Gerät kann alles tun, was Sie wollen. Beispielsweise kann ein Gerät verwendet werden, um einen Datensatz für die zu bearbeitenden Tests abzurufen, oder ein Gerät kann auch verwendet werden, um ein System in einen bekannten Zustand zu versetzen, bevor ein Test ausgeführt wird.Erstens ist es möglich, Geräte in einzelne Testdateien zu legen. Um Geräte jedoch für mehrere Testdateien freizugeben, müssen Sie
conftest.py
für alle Tests eine Datei verwenden, die sich an einem zentralen Ort befindet. Geräte können von jedem Test gemeinsam genutzt werden. Sie können in einzelne Testdateien eingefügt werden, wenn das Gerät nur von Tests in dieser Datei verwendet werden soll.Zweitens, ja , können Sie andere haben
conftest.py
Dateien in Unterverzeichnissen des Top-Tests Verzeichnisses. Inconftest.py
diesem Fall stehen in diesen untergeordneten Dateien definierte Fixtures für Tests in diesem Verzeichnis und in diesen Unterverzeichnissen zur Verfügung.Wenn Sie Fixtures in die
conftest.py
Datei am Teststamm einfügen, werden sie in allen Testdateien verfügbar.quelle