2010-11-16 11 views
21

(Sto usando Python 2.6 e nose.)Python: Come posso creare file temporanei nella mia suite di test?

Sto scrivendo i test per la mia app Python. Voglio un test per aprire un nuovo file, chiuderlo e quindi cancellarlo. Naturalmente, preferisco che ciò accada all'interno di una directory temporanea, perché non voglio cancellare il filesystem dell'utente. E, deve essere cross-OS.

Come faccio?

risposta

12

vedere il modulo tempfile nella libreria standard - dovrebbe essere tutto ciò che serve.

25

FWIW utilizzando py.test si può scrivere:

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

Ogni funzione di test utilizzando il "tmpdir" argomento di funzione otterrà una directory vuota pulita, creato come una sottodirectory di "/ tmp/pytest-NUM "(linux, win32 ha un percorso diverso) dove NUM è aumentato per ogni esecuzione di test. Le ultime tre directory vengono mantenute per facilitare l'ispezione e quelle più vecchie vengono automaticamente eliminate. È inoltre possibile impostare la directory temp di base con py.test --basetemp=mytmpdir.

L'oggetto tmpdir è un oggetto py.path.local che può anche utilizzare in questo modo:

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

Ma è anche bene per convertire solo che una "stringa" percorso:

tmpdir = str(tmpdir) 
+0

Si può usare il comando 'tmpdir' con i metodi setup/teardown xUnit in py.test? Quindi ad es. cambia da 'def setup_method (self, method)' a 'def setup_method (self, method, tmpdir)'? – KomodoDave

+0

tmpdir può essere usato se si decora il metodo di impostazione con '' @ pytest.fixture (autouse = True) '', nel qual caso '' setup_method'' può ricevere i fixtures come normali fixture pytest. Vedi i documenti fixtures per il significato del dispositivo autouse. – hpk42

4

Invece di usare direttamente tempfile, suggerisco di usare un wrapper di context manager per esso - il gestore di contesto si occupa di rimuovere la directory in tutti i casi (successo/fallimento/eccezione) praticamente senza codice.

Ecco come può essere utilizzato:

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

ho utilizzato una versione casa di produzione (l'implementazione è piuttosto breve - meno di 20 righe) fino al punto, quando avevo bisogno di usare da qualche parte anche così, quindi ho guardato in giro se c'è un pacchetto pronto per l'installazione, e infatti c'è: tempdir

+0

tempdir non è nella lib standard: '' 'ImportError: nessun modulo chiamato tempdir''' – dashesy

+0

il pacchetto non può essere trovato da pip! 'pip3 search tempdir' non mostra nulla. – kap

+0

Ho capito quando lo provavo: AttributeError: __exit__ –

Problemi correlati