Die tmpdir
Fixture in py.test verwendet den function
-Bereich und ist daher in einem Fixture mit einem breiteren Geltungsbereich wie session
nicht verfügbar. Dies wäre jedoch in einigen Fällen hilfreich, beispielsweise beim Einrichten eines temporären PostgreSQL-Servers (der natürlich nicht für jeden Test neu erstellt werden sollte).
Gibt es eine saubere Möglichkeit, einen temporären Ordner für einen größeren Bereich zu bekommen, der nicht das Schreiben eigener Appliances und den Zugriff auf interne APIs von py.test erfordert?
Leider gibt es derzeit keine Möglichkeit, dies gut zu machen. In Zukunft wird py.test einen neuen "Any" Scope oder etwas ähnliches einführen, aber das ist die Zukunft.
Jetzt müssen Sie das manuell selbst machen. Wie Sie jedoch bemerken, verlieren Sie einige nette Features: Symlinks in / tmp zum letzten Test, automatische Bereinigung nach ein paar Testläufen, sinnvoll benannte Verzeichnisse usw. Wenn das Verzeichnis nicht zu teuer ist, kombiniere ich normalerweise ein Session- und Function-Scope-Fixture auf folgende Weise:
%Vor% Dies erstellt ein temporäres Verzeichnis, das nach einem Testlauf bereinigt wird, jedoch für jeden Test, der es tatsächlich benötigt (durch Anfordern von dir
), eine Kopie erhält, die mit der tmpdir-Semantik gespeichert wird.
Wenn Tests tatsächlich den Status über dieses Verzeichnis freigeben müssen, müsste der Finalizer von dir
die Objekte zurück in das Sessiondir kopieren. Dies ist jedoch keine sehr gute Idee, da es die Tests von der Ausführungsreihenfolge abhängig macht und auch Probleme bei der Verwendung von pytest-xdist verursachen würde.
Seit pytest Version 2.8 und höher ist das sessionscoped tmpdir_factory
Fixture verfügbar. Siehe das folgende Beispiel aus der Dokumentation .
Ich füge einen Finalizer hinzu, wenn ich alle in der Sitzung erstellten temporären Ordner löschen möchte.
%Vor%Die Ausgabe sollte wie folgt aussehen:
%Vor%Hier ist ein anderer Ansatz. Es sieht so aus, als ob pytest temporäre Verzeichnisse nach Testläufen nicht entfernt. Das Folgende ist ein normales Funktionsgerät.
%Vor%Und dauerhafte persistente Verzeichnisse über Module hinweg anstelle der gesamten pytest-Sitzung haben:
%Vor% Bearbeiten:
Hier ist eine andere Lösung, die keine globalen Variablen enthält. pytest 1.8.0 hat eine tmpdir_factory
Fixture eingeführt, die wir verwenden können: