Python: Comment puis-je créer des fichiers temporaires dans ma suite de test?

(j'utilise Python 2.6 et nose.)

j'écris des tests pour mon application Python. Je veux un test pour ouvrir un nouveau fichier, fermez-la, puis le supprimer. Naturellement, je préfère que cela se passe dans un répertoire temporaire, parce que je ne veux pas détruire le système de fichiers de l'utilisateur. Et ça doit être Cross-OS.

Comment dois-je faire?

23
demandé sur Ram Rachum 2010-11-17 01:27:02

3 réponses

voir le tempfile module dans la bibliothèque standard -- devrait être tout ce dont vous avez besoin.

12
répondu bgporter 2010-11-16 22:28:34

FWIW en utilisant py.test, vous pouvez écrire:

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

chaque fonction de test utilisant l'argument de fonction " tmpdir "obtiendra un répertoire vide propre, créé comme un sous-répertoire de" /tmp/pytest-NUM " (linux, win32 a un chemin différent) où le NUM est augmenté pour chaque exécution de test. Le dernier trois dossiers sont conservés pour faciliter l'inspection et les plus anciens sont automatiquement supprimés. Vous pouvez également définir le répertoire temp py.test --basetemp=mytmpdir.

l'objet tmpdir est un py.chemin.local objet qui peut également l'utiliser comme ceci:

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

mais c'est aussi très bien de simplement le convertir en un chemin "string":

tmpdir = str(tmpdir)
25
répondu hpk42 2010-11-17 14:36:25

au Lieu d'utiliser tempfile directement je suggère d'utiliser un gestionnaire de contexte wrapper pour it - le gestionnaire de contexte prend soin de supprimer le répertoire dans tous les cas (succès/échec/exception) avec essentiellement pas de boilerplate.

Voici comment il peut être utilisé:

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

j'ai utilisé une version maison (l'implémentation est plutôt courte - moins de 20 lignes) jusqu'au point, quand j'ai eu besoin de l'utiliser ailleurs aussi bien, donc j'ai regardé autour de si là est un package prêt à l'installer, et en effet il y a: rep

4
répondu Krisztian Fekete 2012-06-07 22:40:21