2010-11-16 9 views
21

(Ich verwende Python 2.6 und nose.)Python: Wie erstelle ich temporäre Dateien in meiner Testsuite?

Ich schreibe Tests für meine Python-App. Ich möchte mit einem Test eine neue Datei öffnen, sie schließen und anschließend löschen. Natürlich bevorzuge ich das in einem temporären Verzeichnis, weil ich das Dateisystem des Benutzers nicht löschen möchte. Und es muss OS-übergreifend sein.

Wie mache ich das?

Antwort

12

Siehe tempfile Modul in der Standardbibliothek - sollte alles sein, was Sie brauchen.

25

FWIW mit py.test Sie schreiben können:

def test_function(tmpdir): 
    # tmpdir is a unique-per-test-function invocation temporary directory 

Jede Testfunktion des „tmpdir“ Funktionsargument verwendet, wird ein sauberes leeres Verzeichnis erhalten, als ein Unterverzeichnis von „/ tmp/pytest-NUM erstellt "(linux, win32 hat einen anderen Pfad), wobei NUM für jeden Testlauf erhöht wird. Die letzten drei Verzeichnisse werden aufbewahrt, um die Überprüfung zu erleichtern, und ältere Verzeichnisse werden automatisch gelöscht. Sie können das Basistemp-Verzeichnis auch mit py.test --basetemp=mytmpdir festlegen.

Das tmpdir-Objekt ist ein Objekt, das py.path.local auch so verwenden kann:

sub = tmpdir.mkdir("sub") 
sub.join("testfile.txt").write("content") 

Aber es ist auch in Ordnung, es zu konvertieren nur zu einem „string“ Pfad:

tmpdir = str(tmpdir) 
+0

Kann 'tmpdir' funcarg mit setup/teardown xUnit Methoden in py.test verwendet werden? So z.B. Wechsel von 'def setup_method (self, method)' zu 'def setup_method (self, method, tmpdir)'? – KomodoDave

+0

tmpdir kann verwendet werden, wenn Sie Ihre Setup-Methode mit '' pytest.fixture (autouse = True) '' dekorieren, in welchem ​​Fall '' setup_method'' Fixtures als normale Pytest-Fixtures empfangen kann. Sehen Sie sich die Fixtures für die Bedeutung des automatischen Fixtures an. – hpk42

4

Anstatt tempfile direkt zu verwenden, schlage ich vor, einen Context-Manager-Wrapper dafür zu verwenden - der Context-Manager kümmert sich in allen Fällen um das Entfernen des Verzeichnisses (Erfolg/Fehler/Ausnahme) mit praktisch keinem Standardtext.

Hier ist, wie es verwendet werden kann:

from tempdir import TempDir 
... 

# in some test: 
with TempDir() as d: 
    temp_file_name = os.path.join(d.name, 'your_temp_file.name') 
    # create file... 
    # ... 
    # asserts... 

ich eine home grown-Version unter Verwendung war (die Umsetzung ist eher kurz - unter 20 Zeilen) bis zu dem Punkt, als ich brauchte es irgendwo zu verwenden Sonst auch, also schaute ich mich um, ob es ein Paket gibt, das bereit ist zu installieren, und tatsächlich gibt es: tempdir

+0

tempdir ist nicht im Standard lib: '' 'ImportError: Kein Modul namens tempdir''' – dashesy

+0

das Paket kann nicht von pip gefunden werden! 'pip3 search tempdir' zeigt nichts. – kap

+0

Ich habe dies beim Versuch: AttributeError: __exit__ –

Verwandte Themen